perm filename ALPHA.LST[ALF,DEK] blob sn#554085 filedate 1980-07-22 generic text, type T, neo UTF8
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 1

     1                  COMMENT ⊗   VALID 00021 PAGES
     2                  C REC  PAGE   DESCRIPTION
     3                  C00001 00001
     4                  C00004 00002	→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→ ALPHATEX ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
     5                  C00008 00003	 Interrupt jump table (when on-line)
     6                  C00012 00004	 Floppy disk operations:
     7                  C00017 00005	 Other operations available before going on-line:
     8                  C00027 00006	 Primitive debugging routines that might be helpful in emergencies:
     9                  C00035 00007	 Beginning of instructions for on-line processing (non-overlaid area):
    10                  C00038 00008	 Main scanning routine, returns the next byte of input in register A:
    11                  C00041 00009	 A program that prepares to typeset a character.
    12                  C00044 00010	 The main scanning loop, beginning a new instruction:
    13                  C00049 00011	 Program to set a specified beam brightness.
    14                  C00052 00012	 Programs for simple adjustment commands.
    15                  C00054 00013	 Interrupt handling for data received from computer or operator.
    16                  C00060 00014	 Lens motor control routines:
    17                  C00070 00015	 Feed motor control routines:
    18                  C00080 00016	 Programs for beginning and ending the typesetting of a line or page.
    19                  C00089 00017	 Processing of scan-done interrupts:
    20                  C00101 00018	 Handy general-purpose subroutines:
    21                  C00105 00019	 Constants and special tables.
    22                  C00110 00020	 Program variables:
    23                  C00120 00021	 The second memory board (locations 8000H and higher):
    24                  C00132 ENDMK
    25                  C⊗;
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 2

    26                  ;→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→ ALPHATEX ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
    27                  
    28                  ; Symbolic names of I/O ports:
    29  00C8            LTIMR	EQU	0C8H;	lens motor timer.
    30  00CA            GTIMR	EQU	0CAH;	general-purpose timer.
    31  00D0            FTIMR	EQU	0D0H;	feed motor timer.
    32  00C0            INT	EQU	0C0H;	interrupt controller.
    33  00DD            DISPL	EQU	0DDH;	console display, keyboard input, motor switch sensors.
    34  00DA            BTLCH	EQU	0DAH;	"boot latch".
    35  00DB            MSLCH	EQU	0DBH;	"machine status latch".
    36  0088            BRT1	EQU	088H;	brightness control 1.
    37  00A0            BRT2	EQU	0A0H;	brightness control 2.
    38  0098            BEAMR	EQU	098H;	beam position reset.
    39  00DF            BSTEP	EQU	0DFH;	beam step.
    40  00D2            DMA	EQU	0D2H;	direct memory access, RAM to collector board.
    41  00DE            COLL	EQU	0DEH;	start collection.
    42  00DF            RPLCH	EQU	0DFH;	hardware cog counter and repeat latch.
    43  0080            RS232	EQU	080H;	on-line data interface.
    44  00B8            RATE	EQU	0B8H;	repeat counter for baud rate setting.
    45                  
    46                  ; The following addresses refer to subroutines in the boot PROM:
    47  024F            BTAD	EQU	024FH;	binary to ascii decimal.
    48  014C            CAC	EQU	014CH;	convert an ascii character.
    49  0152            CDTAC	EQU	0152H;	convert decimal to ascii.
    50  0223            DC	EQU	0223H;	display a character.
    51  0215            DCS	EQU	0215H;	display a character string.
    52  01B9            EIS	EQU	01B9H;	end interrupt service.
    53  010D            ERROR	EQU	010DH;	fatal error.
    54  0173            KBIS	EQU	0173H;	keyboard interrupt service.
    55  0110            NFE	EQU	0110H;	non-fatal error.
    56  01FE            SMD	EQU	01FEH;	single message display.
    57                  
    58                  ; Note: The ORG instruction preceding "ABRT:" on page 7 needs to be adjusted
    59                  ; if code is added to the non-overlaid parts of this program.
    60                  ; Furthermore, please excuse a trick that saves two (2) bytes:
    61                  ; The least significant byte of location "TABLE" should not be 0 or 1.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 3

    62                  ; Interrupt jump table (when on-line)
    63  4000            	ORG	4000H
    64  4000  CD0D01    	CALL	ERROR;	interrupt 0,
    65  4003  00        	NOP	;		not used.
    66  4004  FB        	EI	;	interrupt 1,
    67  4005  C35177    	JMP	LMIS;		lens motor.
    68  4008  FB        	EI	;	interrupt 2,
    69  4009  C38A7B    	JMP	SDIS;		scan done.
    70  400C  FB        	EI	;	interrupt 3,
    71  400D  C36E78    	JMP	FMIS;		feed motor.
    72  4010  FB        	EI	;	interrupt 4,
    73  4011  C3C479    	JMP	GPTIS;		general purpose timer.
    74  4014  FB        	EI	;	interrupt 5,
    75  4015  C33477    	JMP	KBIS1;		keyboard.
    76  4018  FB        	EI	;	interrupt 6,
    77  4019  C37976    	JMP	RDIS;		on-line data.
    78  401C  CD0D01    	CALL	ERROR;	interrupt 7,
    79  401F  00        	NOP	;		not used.
    80  4020            REP1:		;	First repertoire area, overlays the following.
    81  4020            START:		;	(Bootstrap jumps here after loading this program.)
    82  4020  3E16      	MVI	A,16H;	Move interrupt jump table to 6000H.
    83  4022  D3C0      	OUT	INT
    84  4024  3E60      	MVI	A,60H
    85  4026  D3C1      	OUT	INT+1
    86  4028  3EDF      	MVI	A,11011111B;	(Keyboard is the 0 in bit 5.)
    87  402A  D3C1      	OUT	INT+1;	Enable keyboard interrupt (only).
    88                  
    89  402C  110343    PRMPT:	LXI	D,DM2;	Display 'ALPHATEX ... COMMAND?'.
    90  402F  CD1502    	CALL	DCS
    91  4032  97        WAIT:	SUB	A;	Reset keyboard buffer.
    92  4033  21C47F    	LXI	H,KBLC
    93  4036  77        	MOV	M,A
    94  4037  B6        WAIT1:	ORA	M
    95  4038  CA3740    	JZ	WAIT1;	Wait until command code is typed.
    96                  
    97  403B  3ACB7F    SWICH:	LDA	KBIB
    98  403E  87        	ADD	A;	A = (Key)*(switch table record length).
    99  403F  1600      	MVI	D,0
   100  4041  5F        	MOV	E,A;	DE = 00XX.
   101  4042  214B40    	LXI	H,SWT;	Compute switch table address.
   102  4045  19        	DAD	D
   103  4046  5E        	MOV	E,M;	Fetch branch address from table.
   104  4047  23        	INX	H
   105  4048  56        	MOV	D,M
   106  4049  EB        	XCHG	;	Put branch address in HL.
   107  404A  E9        	PCHL	;	Branch to routine.
   108                  
   109  404B  2C40      SWT:	DW	PRMPT;	0, no op.
   110  404D  2C40      	DW	PRMPT;	1, no op.
   111  404F  2C40      	DW	PRMPT;	2, no op.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 3-2

   112  4051  2C40      	DW	PRMPT;	3, no op.
   113  4053  2C40      	DW	PRMPT;	4, no op.
   114  4055  2C40      	DW	PRMPT;	5, no op.
   115  4057  A942      	DW	ONLIN;	6, go on line.
   116  4059  2C40      	DW	PRMPT;	7, no op.
   117  405B  2C40      	DW	PRMPT;	8, copy font (not yet implemented).
   118  405D  9640      	DW	INITD;	9, initialize diskette.
   119  405F  5541      	DW	SERCH;	A, address search.
   120  4061  C940      	DW	DUMP;	B, backup dump of program.
   121  4063  EF41      	DW	MODFY;	C, change and contemplate memory contents.
   122  4065  6344      	DW	UNTR;	D, dump trace information to host computer.
   123  4067  0441      	DW	LOAD;	E, enter HEX file from host computer.
   124  4069  7242      	DW	FLASH;	F, light show.
   125                  
   126  406B  DBC0      QUIT:	IN	INT
   127  406D  322060    	STA	INTSV;	Store interrupt status for inspection.
   128  4070  3A1D7F    	LDA	BTLS
   129  4073  E6F7      	ANI	11110111B
   130  4075  D3DA      	OUT	BTLCH;	Disable output GO.
   131  4077  3E40      	MVI	A,40H
   132  4079  D3CB      	OUT	LTIMR+3
   133  407B  DBC9      	IN	LTIMR+1
   134  407D  6F        	MOV	L,A
   135  407E  DBC9      	IN	LTIMR+1
   136  4080  67        	MOV	H,A
   137  4081  222460    	SHLD	INTCL;	Store clock reading.
   138  4084  3E34      	MVI	A,34H
   139  4086  D3CB      	OUT	LTIMR+3
   140  4088  3E70      	MVI	A,70H
   141  408A  D3CB      	OUT	LTIMR+3;  Attempt to stop lens motor.
   142  408C  210000    	LXI	H,0
   143  408F  39        	DAD	SP
   144  4090  222260    	SHLD	INTSP;	Store the stack height.
   145  4093  C32040    	JMP	START
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 4

   146                  ; Floppy disk operations:
   147  4096  112943    INITD:	LXI	D,DM3;	Display 'INITIALIZING...'.
   148  4099  CDFE01    	CALL	SMD
   149                  
   150  409C  21D843    	LXI	H,NEWDSK; Initialize first track.
   151  409F  CDE740    	CALL	DSKCOM
   152  40A2  C2C040    	JNZ	INIT3;	Jump if error.
   153                  
   154  40A5  3E1A      INIT1:	MVI	A,26;	Next track.
   155  40A7  32FF7F    	STA	NSCT;	26 sectors,
   156  40AA  3E01      	MVI	A,1
   157  40AC  32FC7F    	STA	SECTR;	   beginning with sector 1.
   158  40AF  CDF540    	CALL	DSKGO
   159  40B2  C2C040    	JNZ	INIT3
   160                  
   161  40B5  3AFB7F    	LDA	TRACK
   162  40B8  FE4D      	CPI	77
   163  40BA  C2A540    	JNZ	INIT1;	Repeat until track 77 reached.
   164  40BD  C32C40    	JMP	PRMPT;	Return to control routine.
   165                  
   166  40C0            INIT3:
   167  40C0  113943    DUMP3:	LXI	D,DM4;	'CANNOT WRITE ON DISK 1'.
   168  40C3  CD1001    DUMP4:	CALL	NFE
   169  40C6  C32C40    	JMP	PRMPT
   170                  
   171  40C9  115043    DUMP:	LXI	D,DM5;	Display 'BACKUP COPY BEING DUMPED...'.
   172  40CC  CDFE01    	CALL	SMD
   173                  
   174  40CF  21E043    	LXI	H,WRT32K; Write 32K starting at 4000H.
   175  40D2  CDE740    	CALL	DSKCOM
   176  40D5  C2C040    	JNZ	DUMP3
   177                  
   178  40D8  21E843    	LXI	H,CHK32K; Check 32K starting at 4000H.
   179  40DB  CDE740    	CALL	DSKCOM
   180  40DE  CA2C40    	JZ	PRMPT;	Return to control routine.
   181                  
   182  40E1  116C43    	LXI	D,DM6;	'COULDN'T READ WHAT WAS DUMPED'.
   183  40E4  C3C340    	JMP	DUMP4
   184                  
   185                  ; Subroutine DSKCOM does disk I/O; arguments are in block pointed to by HL.
   186                  
   187  40E7  7E        DSKCOM:	MOV	A,M;	Select sector format.
   188  40E8  32EE7F    	STA	VARSE
   189  40EB  23        	INX	H
   190  40EC  010600    	LXI	B,6;	Move 6 bytes to COMWD.
   191  40EF  11F97F    	LXI	D,COMWD
   192  40F2  CDDC7D    	CALL	MOVE
   193                  
   194  40F5  3E08      DSKGO:	MVI	A,8;	Start disk command.
   195  40F7  32F87F    	STA	OKWD
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 4-2

   196                  
   197  40FA  3AF87F    DSKWT:	LDA	OKWD;	Wait for OKWD to change (disk command finished).
   198  40FD  FE08      	CPI	8
   199  40FF  CAFA40    	JZ	DSKWT
   200  4102  B7        	ORA	A;	Report success or failure.
   201  4103  C9        	RET
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5

   202                  ; Other operations available before going on-line:
   203  4104  3A00BF    LOAD:	LDA	LOADR
   204  4107  FECD      	CPI	0CDH;	Check if load routine seems intact.
   205  4109  C22C40    	JNZ	PRMPT;	If not, this routine is disabled.
   206  410C  11AE43    	LXI	D,DM10;	Display 'READY TO LOAD A HEX FILE:'.
   207  410F  CDFE01    	CALL	SMD
   208                  
   209  4112  3EFF      	MVI	A,11111111B
   210  4114  D3C1      	OUT	INT+1;		All interrupts are disabled.
   211                  
   212  4116  3E0F      	MVI	A,00001111B
   213  4118  D3B8      	OUT	RATE
   214  411A  3E03      	MVI	A,00000011B;   Force USART chip into command state.
   215  411C  D381      	OUT	RS232+1
   216  411E  3E61      	MVI	A,01100001B;   Reset USART chip.
   217  4120  D381      	OUT	RS232+1
   218  4122  3E4E      	MVI	A,01001110B;   Set baud rate 9600.
   219  4124  D381      	OUT	RS232+1
   220  4126  3E37      	MVI	A,00110111B;   Enable USART for sending and receiving.
   221  4128  D381      	OUT	RS232+1;
   222  412A  C300BF    	JMP	LOADR
   223                  
   224  412D  7D        CHB:	MOV	A,L;	Subroutine to convert hex codes to one byte:
   225  412E  07        	RLC	;	(If HL = 0X 0Y hex, then A = YX hex.)
   226  412F  07        	RLC
   227  4130  07        	RLC
   228  4131  07        	RLC
   229  4132  B4        	ORA	H
   230  4133  C9        	RET
   231                  
   232  4134  97        RDKC:	SUB	A;	Subroutine to read and display B keyboard codes:
   233  4135  32C47F    	STA	KBLC;	Clear keyboard buffer.
   234                  
   235  4138  21C47F    RDKC1:	LXI	H,KBLC; Look at input buffer count.
   236  413B  7E        	MOV	A,M
   237  413C  BE        RDKC2:	CMP	M
   238  413D  CA3C41    	JZ	RDKC2;	Wait until code entered (KBLC changes).
   239                  
   240  4140  5F        	MOV	E,A
   241  4141  1600      	MVI	D,0;	DE=count.
   242  4143  21CB7F    	LXI	H,KBIB
   243  4146  19        	DAD	D
   244  4147  7E        	MOV	A,M;	Get keyboard code.
   245  4148  C5        	PUSH	B
   246  4149  CD5201    	CALL	CDTAC;	Convert hexadecimal to ascii.
   247  414C  CD2302    	CALL	DC;	Display the character.
   248  414F  C1        	POP	B
   249  4150  05        	DCR	B
   250  4151  C23841    	JNZ	RDKC1;	Repeat.
   251  4154  C9        	RET
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5-2

   252                  
   253                  
   254  4155  2AFEBF    SERCH:	LHLD	0BFFEH
   255  4158  E5        	PUSH	H;	Save top two bytes of memory.
   256                  
   257  4159  118A43    	LXI	D,DM7;	Display 'ADDRESS '.
   258  415C  CDFE01    	CALL	SMD
   259  415F  0604      	MVI	B,4
   260  4161  CD3441    	CALL	RDKC;	Read and display four keyboard codes.
   261                  
   262  4164  2ACB7F    	LHLD	KBIB;	Convert them to binary.
   263  4167  CD2D41    	CALL	CHB
   264  416A  57        	MOV	D,A
   265  416B  32FFBF    	STA	0BFFFH;	Store at top end of memory.
   266  416E  2ACD7F    	LHLD	KBIB+2
   267  4171  CD2D41    	CALL	CHB
   268  4174  5F        	MOV	E,A
   269  4175  32FEBF    	STA	0BFFEH
   270                  
   271  4178  210040    	LXI	H,4000H; Begin search at 4000H.
   272  417B  7E        SRCH1:	MOV	A,M
   273  417C  BB        SRCH2:	CMP	E
   274  417D  23        	INX	H
   275  417E  C27B41    	JNZ	SRCH1
   276  4181  7E        	MOV	A,M
   277  4182  BA        	CMP	D
   278  4183  C27C41    	JNZ	SRCH2
   279                  
   280  4186  2B        	DCX	H;	We found one in location HL.
   281  4187  7C        	MOV	A,H
   282  4188  FEBF      	CPI	0BFH
   283  418A  C29441    	JNZ	SRCH3
   284  418D  7D        	MOV	A,L
   285  418E  FEFE      	CPI	0FEH
   286  4190  CAE441    	JZ	SRCH9;	Exit if it was the top location (we knew about that).
   287  4193  7C        	MOV	A,H
   288  4194  22ED41    SRCH3:	SHLD	SLOC
   289  4197  EB        	XCHG
   290  4198  22EB41    	SHLD	SLOOK
   291                  
   292  419B  21CA43    	LXI	H,DM11+2
   293  419E  0F        	RRC
   294  419F  0F        	RRC
   295  41A0  0F        	RRC
   296  41A1  0F        	RRC
   297  41A2  CD4C01    	CALL	CAC;	Convert left four bits to ascii, storing in DM11.
   298  41A5  3AEE41    	LDA	SLOC+1
   299  41A8  CD4C01    	CALL	CAC;	Convert right four bits to ascii.
   300  41AB  3AED41    	LDA	SLOC
   301  41AE  47        	MOV	B,A
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5-3

   302  41AF  0F        	RRC
   303  41B0  0F        	RRC
   304  41B1  0F        	RRC
   305  41B2  0F        	RRC
   306  41B3  CD4C01    	CALL	CAC;	And again, four+four bits to ascii.
   307  41B6  78        	MOV	A,B
   308  41B7  CD4C01    	CALL	CAC
   309  41BA  11C843    	LXI	D,DM11
   310  41BD  CD1502    	CALL	DCS;	Display where we found it.
   311                  	
   312  41C0  97        	SUB	A
   313  41C1  32C47F    	STA	KBLC
   314  41C4  21C47F    	LXI	H,KBLC
   315  41C7  BE        SRCH4:	CMP	M
   316  41C8  CAC741    	JZ	SRCH4;	Wait until user tingles the keyboard.
   317                  
   318  41CB  3ACB7F    	LDA	KBIB
   319  41CE  FE0A      	CPI	0AH
   320  41D0  C2E441    	JNZ	SRCH9;	Exit if not 'A'.
   321                  
   322  41D3  2AEB41    	LHLD	SLOOK
   323  41D6  EB        	XCHG
   324  41D7  210000    	LXI	H,0
   325  41DA  22EB41    	SHLD	SLOOK
   326  41DD  2AED41    	LHLD	SLOC
   327  41E0  23        	INX	H
   328  41E1  C37B41    	JMP	SRCH1;	Otherwise continue the search.
   329                  
   330  41E4  E1        SRCH9:	POP	H
   331  41E5  22FEBF    	SHLD	0BFFEH;	Restore top two bytes.
   332  41E8  C32C40    	JMP	PRMPT
   333  41EB  0000      SLOOK:	DW	0;	What we're seeking.
   334  41ED  0000      SLOC:	DW	0;	Where we found it.
   335                  	
   336                  
   337                  
   338  41EF  118A43    MODFY:	LXI	D,DM7;	Display 'ADDRESS '.
   339  41F2  CDFE01    	CALL	SMD
   340  41F5  0604      	MVI	B,4
   341  41F7  CD3441    	CALL	RDKC;	Read and display four keyboard codes.
   342                  
   343  41FA  2ACB7F    	LHLD	KBIB;	Convert them to binary.
   344  41FD  CD2D41    	CALL	CHB
   345  4200  57        	MOV	D,A
   346  4201  2ACD7F    	LHLD	KBIB+2
   347  4204  CD2D41    	CALL	CHB
   348  4207  5F        	MOV	E,A
   349                  
   350  4208  7A        MM1:	MOV	A,D;	Check if address is in range.
   351  4209  FE40      	CPI	40H
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5-4

   352  420B  DA6C42    	JC	MM3
   353  420E  FEC0      	CPI	0C0H
   354  4210  D26C42    	JNC	MM3
   355                  
   356  4213  D5        	PUSH	D;	Save address.
   357  4214  EB        	XCHG
   358  4215  46        	MOV	B,M;	Current byte value to B.
   359                  
   360  4216  219543    	LXI	H,DM8+2;	Convert "XX" to ASCII(A).
   361  4219  78        	MOV	A,B
   362  421A  0F        	RRC
   363  421B  0F        	RRC
   364  421C  0F        	RRC
   365  421D  0F        	RRC
   366  421E  CD4C01    	CALL	CAC;	Convert left four bits to ascii.
   367  4221  78        	MOV	A,B
   368  4222  CD4C01    	CALL	CAC;	Convert right four bits to ascii.
   369  4225  119343    	LXI	D,DM8
   370  4228  CD1502    	CALL	DCS;	Display ' xx->'.
   371                  
   372  422B  0602      	MVI	B,2
   373  422D  CD3441    	CALL	RDKC;	Read and display two keyboard codes.
   374  4230  3AC47F    MM2:	LDA	KBLC;	Read the next code.
   375  4233  FE03      	CPI	3
   376  4235  DA3042    	JC	MM2
   377                  
   378  4238  D1        	POP	D;	Get modify address back.
   379                  
   380  4239  3ACD7F    	LDA	KBIB+2
   381  423C  FE0B      	CPI	0BH
   382  423E  CA0842    	JZ	MM1;	Back to same byte, unmodified, if "B".
   383  4241  FE0C      	CPI	0CH
   384  4243  CAEF41    	JZ	MODFY;	Call for new address, no change here, if "C".
   385  4246  FE0D      	CPI	0DH
   386  4248  CA6842    	JZ	DNWRD;	Decrement to previous byte, no modification, if "D".
   387  424B  FE0E      	CPI	0EH
   388  424D  CA2C40    	JZ	PRMPT;	Exit, no modification, if "E".
   389  4250  FE0F      	CPI	0FH
   390  4252  CA6442    	JZ	ONWRD;	Forward to next byte, no modification, if "F".
   391                  
   392  4255  2ACB7F    	LHLD	KBIB;	Fetch codes typed for this byte.
   393  4258  CD2D41    	CALL	CHB;	Convert them to binary.
   394  425B  12        	STAX	D;	Store the new byte.
   395                  
   396  425C  3ACD7F    	LDA	KBIB+2
   397  425F  FE0A      	CPI	0AH;	Advance, modified, if "A".
   398  4261  C22C40    	JNZ	PRMPT;	Otherwise go home, modification accepted.
   399  4264  13        ONWRD:	INX	D
   400  4265  C30842    	JMP	MM1;	Go on to next word.
   401                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5-5

   402  4268  1B        DNWRD:	DCX	D
   403  4269  C30842    	JMP	MM1;	Go down to previous word.
   404                  
   405  426C  119943    MM3:	LXI	D,DM9;	'ADDRESS OUT OF RANGE'.
   406  426F  C3C340    	JMP	DUMP4
   407                  
   408  4272  97        FLASH:	SUB	A
   409  4273  32C47F    	STA	KBLC;	Clear keyboard buffer.
   410  4276  06F7      	MVI	B,11110111B;   B←one bit of light.
   411  4278  68        	MOV	L,B;	       Ensure that HL ≠ 00.
   412                  
   413  4279  1111A0    FL1:	LXI	D,0A011H;       DE←primitive polynomial.
   414  427C  29        	DAD	H;	Advance the shift register sequence (period is 65535).
   415  427D  78        	MOV	A,B
   416  427E  D28A42    	JNC	FL2
   417  4281  19        	DAD	D
   418                  
   419  4282  0F        	RRC
   420  4283  DA9042    	JC	FL3
   421  4286  0F        	RRC	;	Seven-bit rotation, moves the bit down.
   422  4287  C39042    	JMP	FL3
   423                  
   424  428A  07        FL2:	RLC
   425  428B  B7        	ORA	A
   426  428C  FA9042    	JM	FL3
   427  428F  07        	RLC	;	Seven-bit rotation, moves the bit up.
   428                  
   429  4290  47        FL3:	MOV	B,A
   430  4291  E67F      	ANI	01111111B
   431  4293  EE00      	XRI	00000000B
   432  4295  D3DD      	OUT	DISPL;	Display the new column.
   433                  
   434  4297  3AC47F    	LDA	KBLC
   435  429A  B7        	ORA	A
   436  429B  C23B40    	JNZ	SWICH;	Return to control after the next typein.
   437                  
   438  429E  EB        	XCHG
   439  429F  21C801    	LXI	H,200+256
   440  42A2  CDF27D    	CALL	DELAY;	Delay about 10 milliseconds.
   441  42A5  EB        	XCHG
   442                  
   443  42A6  C37942    	JMP	FL1;	Repeat.
   444                  
   445  42A9  3E16      ONLIN:	MVI	A,16H
   446  42AB  D3C0      	OUT	INT
   447  42AD  3E40      	MVI	A,40H
   448  42AF  D3C1      	OUT	INT+1;	Move the interrupt jump table to 4000H.
   449  42B1  3E81      	MVI	A,10000001B
   450  42B3  D3C1      	OUT	INT+1;	Enable all six interrupts.
   451  42B5  3E0B      	MVI	A,00001011B
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5-6

   452  42B7  D3C0      	OUT	INT;	Prepare to read interrupt status register.
   453                  
   454  42B9  3E0F      	MVI	A,00001111B
   455  42BB  D3B8      	OUT	RATE
   456  42BD  3E03      	MVI	A,00000011B;   Force USART chip into command state.
   457  42BF  D381      	OUT	RS232+1
   458  42C1  3E61      	MVI	A,01100001B;   Reset USART chip.
   459  42C3  D381      	OUT	RS232+1
   460  42C5  3E4E      	MVI	A,01001110B;   Set baud rate 9600.
   461  42C7  D381      	OUT	RS232+1
   462  42C9  3E37      	MVI	A,00110111B;   Enable USART for sending and receiving.
   463  42CB  D381      	OUT	RS232+1;
   464                  
   465  42CD  3AD47E    	LDA	MSLSI
   466  42D0  D3DB      	OUT	MSLCH
   467  42D2  3AD57E    	LDA	BTLSI
   468  42D5  D3DA      	OUT	BTLCH
   469  42D7  31C27F    	LXI	SP,ISPV;	We want to start with a fresh stack.
   470  42DA  11CE43    	LXI	D,DM14;		Display `ON LINE: '.
   471  42DD  CDFE01    	CALL	SMD
   472  42E0  210085    	LXI	H,8500H
   473  42E3  22F043    	SHLD	TRACL;	Initialize for tracing.
   474  42E6  C3B573    	JMP	REST2;	Start (or restart) the typesetting program.
   475                  
   476                  ; Table of display messages that are overlaid:
        42E9  1944554D  
        42ED  50494E47  
        42F1  20544845  
        42F5  20545241  
        42F9  43452049  
        42FD  4E464F2E  
   477  4301  2E2E      DM1:	DB	25,'DUMPING THE TRACE INFO...'
        4303  25414C50  
        4307  48415445  
        430B  58205345  
        430F  52564552  
        4313  204A554C  
        4317  5920372C  
        431B  31393830  
        431F  2E20434F  
        4323  4D4D414E  
   478  4327  443F      DM2:	DB	37,'ALPHATEX SERVER JULY 7,1980. COMMAND?'
        4329  0F494E49  
        432D  5449414C  
        4331  495A494E  
   479  4335  472E2E2E  DM3:	DB	15,'INITIALIZING...'
        4339  1643414E  
        433D  4E4F5420  
        4341  57524954  
        4345  45204F4E  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5-7

        4349  20444953  
   480  434D  4B2031    DM4:	DB	22,'CANNOT WRITE ON DISK 1'
        4350  1B424143  
        4354  4B555020  
        4358  434F5059  
        435C  20424549  
        4360  4E472044  
        4364  554D5045  
   481  4368  442E2E2E  DM5:	DB	27,'BACKUP COPY BEING DUMPED...'
        436C  1D434F55  
        4370  4C444E27  
        4374  54205245  
        4378  41442057  
        437C  48415420  
        4380  57415320  
        4384  44554D50  
   482  4388  4544      DM6:	DB	29,'COULDN',27H,'T READ WHAT WAS DUMPED'
        438A  08414444  
        438E  52455353  
   483  4392  20        DM7:	DB	8,'ADDRESS '
        4393  05205858  
   484  4397  2D3E      DM8:	DB	5,' XX->'
        4399  14414444  
        439D  52455353  
        43A1  204F5554  
        43A5  204F4620  
        43A9  52414E47  
   485  43AD  45        DM9:	DB	20,'ADDRESS OUT OF RANGE'
        43AE  19524541  
        43B2  44592054  
        43B6  4F204C4F  
        43BA  41442041  
        43BE  20484558  
        43C2  2046494C  
   486  43C6  453A      DM10:	DB	25,'READY TO LOAD A HEX FILE:'
        43C8  05205858  
   487  43CC  5858      DM11:	DB	5,' XXXX'
        43CE  094F4E20  
        43D2  4C494E45  
   488  43D6  3A20      DM14:	DB	9,'ON LINE: '
   489                  
   490                  ;	    	VARSE	COMWD	DISK	TRACK	SECTR	ADDR		NSCT
        43D8  00060100  
   491  43DC  0100001A  NEWDSK:	DB	0,	6,	1,	0,	1,	00,00,		26
        43E0  00020100  
   492  43E4  01004000  WRT32K:	DB	0,	2,	1,	0,	1,	00,40H,		0
        43E8  00030100  
   493  43EC  01004000  CHK32K:	DB	0,	3,	1,	0,	1,	00,40H,		0
   494                  
   495  43F0            DSKARG:	PHASE	0;	Defining disk command argument block.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 5-8

   496  43F0  00        SETVAR:	DB	0
   497  43F1  00        SETCOM:	DB	0
   498  43F2  00        SETDSK:	DB	0
   499  43F3  00        SETTRK:	DB	0
   500  43F4  00        SETSCT:	DB	0
   501  43F5  0000      SETADR:	DW	00
   502  0007            SETNSC:	DEPHASE
   503  43F0            	ORG	DSKARG
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 6

   504                  ; Primitive debugging routines that might be helpful in emergencies:
   505                  
   506  43F0  0085      TRACL:	DW	8500H; Area where next tracing info will be dumped.
   507  43F2  0085      UNTRL:	DW	8500H; Location to begin output of tracing info.
   508                  
   509                  ; If "CALL TRACE" is inserted into the non-overlaid program,
   510                  ; and if the "overlaid" sections of AlphaTEX are not in fact overlaid,
   511                  ; this subroutine will store 16 bytes of potentially relevant information, to wit:
   512                  
   513                  ;	xxx0	lsb of stack pointer
   514                  ;	xxx1	the interrupt service register
   515                  ;	xxx2	register C
   516                  ;	xxx3	register B
   517                  ;	xxx4	register E
   518                  ;	xxx5	register D
   519                  ;	xxx6	register L
   520                  ;	xxx7	register H
   521                  ;	xxx8	sign,zero,0,auxcarry,0,parity,1,carry bits
   522                  ;	xxx9	register A
   523                  ;	xxxA	lsb of calling location
   524                  ;	xxxB	msb of calling location
   525                  ;	xxxC	top byte of stack
   526                  ;	xxxD	2nd byte of stack
   527                  ;	xxxE	3rd byte of stack
   528                  ;	xxxF	4th byte of stack
   529                  
   530                  ; Caution: It takes 897 cycles (448.5 microseconds) to CALL TRACE.  This might
   531                  ; interfere with the program timing, especially when servicing interrupts.
   532                  
   533  43F4  F5        TRACE:	PUSH	PSW;	First we fill the stack with stuff to dump.
   534  43F5  E5        	PUSH	H
   535  43F6  D5        TRAC2:	PUSH	D
   536  43F7  C5        	PUSH	B
   537                  
   538  43F8  3EFF      	MVI	A,11111111B
   539  43FA  D3C1      	OUT	INT+1;	Disable all interrupts;
   540                  
   541  43FC  21FEFF    	LXI	H,-2
   542  43FF  39        	DAD	SP;	H ← value of SP after the PUSH to follow.
   543  4400  5D        	MOV	E,L
   544  4401  DBC0      	IN	INT
   545  4403  57        	MOV	D,A
   546  4404  D5        	PUSH	D;	This pushes lsb of stack pointer and the ISR byte.
   547  4405  EB        	XCHG	;	DE←stack pointer.
   548  4406  2AF043    	LHLD	TRACL
   549  4409  0E10      	MVI	C,16
   550                  
   551  440B  1A        TRAC1:	LDAX	D;	Now we copy the top 16 bytes of the stack.
   552  440C  77        	MOV	M,A
   553  440D  13        	INX	D
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 6-2

   554  440E  23        	INX	H
   555  440F  0D        	DCR	C
   556  4410  C20B44    	JNZ	TRAC1
   557                  
   558  4413  22F043    	SHLD	TRACL
   559  4416  3E81      	MVI	A,10000001B
   560  4418  D3C1      	OUT	INT+1;	Unmask the interrupts.
   561  441A  7C        	MOV	A,H
   562  441B  FEBC      	CPI	0BCH
   563                  
   564  441D  D1        	POP	D;	Restore registers.
   565  441E  C1        	POP	B
   566  441F  D1        	POP	D
   567  4420  CA3244    	JZ	DEB3;	Abort if the trace dump area is full.
   568  4423  E1        TRAC3:	POP	H
   569  4424  F1        	POP	PSW
   570  4425  C9        	RET
   571                  
   572                  ; If "CALL DEBUG" is inserted into the non-overlaid program,
   573                  ; and if the "overlaid" sections of AlphaTEX are not in fact overlaid,
   574                  ; this subroutine will do a TRACE and also generate an ABORT command
   575                  ; that will take AlphaTEX off line again.
   576                  
   577  4426  3A1D7F    DEB0:	LDA	BTLS;	This entrance comes from a missed scan-done interrupt.
   578  4429  E6F7      	ANI	11110111B
   579  442B  321D7F    	STA	BTLS
   580  442E  D3DA      	OUT	BTLCH;	Disable output GO.
   581                  
   582  4430  F5        DEBUG:	PUSH	PSW;	Store registers, in preparation for TRACE.
   583  4431  E5        	PUSH	H
   584                  
   585  4432  3E0F      DEB3:	MVI	A,00001111B
   586  4434  32157F    	STA	QFLAG;	Abort prepared.
   587  4437  2A5D44    	LHLD	DEB1
   588  443A  22B573    	SHLD	REST2;	CODE MODIFICATION!!!
   589  443D  3A5F44    	LDA	DEB1+2
   590  4440  32B773    	STA	REST2+2;	Store a JMP DEB2 at RESET handler.
   591                  
   592  4443  3AF143    	LDA	TRACL+1; Look at msb of TRACL.
   593  4446  FEBC      	CPI	0BCH
   594  4448  C2F643    	JNZ	TRAC2;	Trace, unless trace dump area is full.
   595  444B  C3A273    	JMP	ABRT1;	Otherwise abort.
   596                  
   597  444E  2A6044    DEB2:	LHLD	REST0
   598  4451  22B573    	SHLD	REST2;	Restore location REST2 to normal contents.
   599  4454  3A6244    	LDA	REST0+2
   600  4457  32B773    	STA	REST2+2
   601  445A  C32040    	JMP	START;	Restart off-line command processing.
   602                  
   603  445D  C34E44    DEB1:	JMP	DEB2;	Command stored temporarily in location REST2.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 6-3

   604  4460  011700    REST0:	LXI	B,INITE-INITB;	Normal contents of location REST2.
   605                  
   606                  ; The following routine sends the traced data back to a host computer file
   607                  ; so that it can be studied at leisure.
   608  4463  11E942    UNTR:	LXI	D,DM1;	Display 'DUMPING TRACE INFO...'.
   609  4466  CDFE01    	CALL	SMD
   610  4469  97        	SUB	A
   611  446A  32C47F    	STA	KBLC
   612  446D  2AF043    	LHLD	TRACL
   613  4470  EB        	XCHG	;	 DE ← end of tracing info.
   614  4471  2AF243    	LHLD	UNTRL;   HL ← start of tracing info.
   615                  
   616  4474  7D        UNTR1:	MOV	A,L
   617  4475  E60F      	ANI	1111B
   618  4477  C29D44    	JNZ	UNTR2;	Jump if not multiple of 16.
   619                  	
   620  447A  3AC47F    	LDA	KBLC
   621  447D  B7        	ORA	A
   622  447E  C2A844    	JNZ	UNTR5;	Jump if user interrupts.
   623                  
   624  4481  3E0D      	MVI	A,0DH;	carriage-return
   625  4483  CDC644    	CALL	SENDC
   626  4486  3E0A      	MVI	A,0AH;	line-feed
   627  4488  CDC644    	CALL	SENDC
   628                  
   629  448B  7A        	MOV	A,D
   630  448C  BC        	CMP	H
   631  448D  C29544    	JNZ	UNTR3;	Jump if not done.
   632  4490  7B        	MOV	A,E
   633  4491  BD        	CMP	L
   634  4492  CAA544    	JZ	UNTR4;	Jump if done.
   635                  
   636  4495  7D        UNTR3:	MOV	A,L;	Send the current location.
   637  4496  CDAE44    	CALL	SENDB
   638  4499  7C        	MOV	A,H
   639  449A  CDAE44    	CALL	SENDB
   640                  
   641  449D  7E        UNTR2:	MOV	A,M
   642  449E  CDAE44    	CALL	SENDB
   643  44A1  23        	INX	H
   644  44A2  C37444    	JMP	UNTR1
   645                  
   646  44A5  210085    UNTR4:	LXI	H,8500H
   647  44A8  22F243    UNTR5:	SHLD	UNTRL
   648  44AB  C32C40    	JMP	PRMPT
   649                  
   650  44AE  F5        SENDB:	PUSH	PSW;	This subroutine outputs a byte in hexadecimal form.
   651  44AF  0F        	RRC
   652  44B0  0F        	RRC
   653  44B1  0F        	RRC
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 6-4

   654  44B2  0F        	RRC
   655  44B3  CD5201    	CALL	CDTAC;	Convert left four bits to ascii.
   656  44B6  CDC644    	CALL	SENDC
   657  44B9  F1        	POP	PSW
   658  44BA  CD5201    	CALL	CDTAC;	Convert right four bits to ascii.
   659  44BD  CDC644    	CALL	SENDC
   660  44C0  3E20      	MVI	A,' '
   661  44C2  CDC644    	CALL	SENDC
   662  44C5  C9        	RET
   663                  
   664  44C6  E5        SENDC:	PUSH	H;   	Outputs a character to the host.
   665  44C7  21C801    	LXI	H,200+256;	Delay about 10 milliseconds.
   666  44CA  CDF27D    	CALL	DELAY
   667  44CD  E1        	POP	H
   668  44CE  D380      	OUT	RS232; Send the character.
   669  44D0  C9        	RET
   670                  
   671                  ; Temporary interrupt jump table (later overlaid):
   672  6000            	ORG	6000H
   673  6000  CD0D01    	CALL	ERROR;	interrupt 0,
   674  6003  00        	NOP	;		not used.
   675  6004  CD0D01    	CALL	ERROR;	interrupt 1,
   676  6007  00        	NOP	;		not used.
   677  6008  CD0D01    	CALL	ERROR;	interrupt 2,
   678  600B  00        	NOP	;		not used.
   679  600C  CD0D01    	CALL	ERROR;	interrupt 3,
   680  600F  00        	NOP	;		not used.
   681  6010  CD0D01    	CALL	ERROR;	interrupt 4,
   682  6013  00        	NOP	;		not used.
   683  6014  FB        	EI	;	interrupt 5,
   684  6015  C37301    	JMP	KBIS;		keyboard.
   685  6018  CD0D01    	CALL	ERROR;	interrupt 6,
   686  601B  00        	NOP	;		not used.
   687  601C  CD0D01    	CALL	ERROR;	interrupt 7,
   688  601F  00        	NOP	;		not used.
   689                  
   690  6020  00        INTSV:	DB	0;	interrupt status byte saved by QUIT.
   691  6021  01        INTTP:	DB	1;	type of jump to QUIT.
   692  6022  0000      INTSP:	DW	0;	stack pointer saved by QUIT.
   693  6024  0000      INTCL:	DW	0;	clock reading saved by QUIT.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 7

   694                  ; Beginning of instructions for on-line processing (non-overlaid area):
   695  73A0            	ORG	73A0H;	This address to be adjusted so that page 20 comes out right.
   696  73A0  D380      ABRT:	OUT	RS232;	(Control reaches here from GET subroutine.)
   697  73A2  11B97E    ABRT1:	LXI	D,ABORT
   698  73A5  CD1502    	CALL	DCS;	Display " ABORTED."
   699  73A8  D1        	POP	D;	Do not return from GET.
   700  73A9  0E0F      RESET:	MVI	C,15;	Delay about 15 seconds, to make sure that interrupts cease.
   701  73AB  21204E    REST1:	LXI	H,20000
   702  73AE  CDF27D    	CALL	DELAY
   703  73B1  0D        	DCR	C
   704  73B2  C2AB73    	JNZ	REST1
   705                  
   706  73B5  011700    REST2:	LXI	B,INITE-INITB;	Initialize all variables that need it.
   707  73B8  110B7F    	LXI	D,INITV
   708  73BB  21C37E    	LXI	H,INITB
   709  73BE  3EFF      	MVI	A,11111111B
   710  73C0  D3C1      	OUT	INT+1;	Disable all interrupts (especially RDIS).
   711  73C2  CDDC7D    	CALL	MOVE
   712  73C5  3E81      	MVI	A,10000001B
   713  73C7  D3C1      	OUT	INT+1;	Enable all six interrupts.
   714                  
   715  73C9  3A0D7F    EOF:	LDA	READY;	End-of-film command:
   716  73CC  21C37F    	LXI	H,FMBSY
   717  73CF  B6        	ORA	M
   718  73D0  21C27F    	LXI	H,LMBSY
   719  73D3  B6        	ORA	M
   720  73D4  C2C973    	JNZ	EOF;	Wait until READY=FMBSY=LMBSY=0.
   721                  
   722  73D7  2A4F7F    	LHLD	FMP
   723  73DA  EB        	XCHG
   724  73DB  2A4B7F    	LHLD	YHOME;	Set up to move the feed motor to home position,
   725  73DE  CD927D    	CALL	CMPD;	   after unclamping the film.
   726  73E1  3E01      	MVI	A,1
   727  73E3  C4A879    	CNZ	NCLMP
   728                  
   729  73E6  110000    	LXI	D,0;	Start lens motor moving to home position.
   730  73E9  CD6977    	CALL	LGO0
   731                  
   732  73EC  320C7F    	STA	KBIB1;	Clear keyboard buffer.
   733                  
   734  73EF  211C7F    	LXI	H,MSLS
   735  73F2  3E80      	MVI	A,10000000B
   736  73F4  B6        	ORA	M
   737  73F5  77        	MOV	M,A
   738  73F6  D3DB      	OUT	MSLCH;	Turn audio signal on.
   739                  
   740  73F8  3E2A      	MVI	A,'*'
   741  73FA  CD2302    	CALL	DC;	Display an asterisk.
   742  73FD  C3BA74    	JMP	READ;	Go on to read the next instruction.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 8

   743                  ; Main scanning routine, returns the next byte of input in register A:
   744                  
   745                  ; (Note: H and L are clobbered, but not B, C, D, or E. This subroutine
   746                  ; must not be called from within another subroutine, because of the way
   747                  ; it handles requests to ABORT the job.)
   748                  
   749  7400  2A127F    GET:	LHLD	DQOUT;	Spot in queue from which to get character.
   750  7403  3A157F    	LDA	QFLAG
   751  7406  B7        	ORA	A
   752  7407  CA2D74    	JZ	GET0;	Jump if no transmission to the host was requested.
   753                  
   754  740A  DB81          	IN	RS232+1
   755  740C  E605      	ANI	101B
   756  740E  EE05      	XRI	101B
   757  7410  C22D74    	JNZ	GET0;	Jump if the line is busy.
   758                  
   759                  ; Now the line is "doubly free": the USART will be able to send a character
   760                  ; during an RS232 interrupt as well as the character we are about to send.
   761                  
   762  7413  3A157F    	LDA	QFLAG
   763  7416  FE0F      	CPI	00001111B
   764  7418  CAA073    	JZ	ABRT;	Jump if abortion requested.
   765                  
   766  741B  3A0E7F    	LDA	DQIN
   767  741E  95        	SUB	L;	A ← buffer space in use.
   768  741F  FEC0      	CPI	256-64
   769  7421  D22D74    	JNC	GET0;	Jump if there isn't room in buffer for another block.
   770                  ; If rA less than 256-64, there are at least 64 usable spaces in the buffer
   771                  ; (63 for data and one for the sum check byte). Buffer capacity is 255 bytes.
   772                  
   773  7424  3A157F    QOK:	LDA	QFLAG;	QFLAG contains the acknowledgment byte we wish to send.
   774  7427  D380      	OUT	RS232
   775  7429  97        	SUB	A
   776  742A  32157F    	STA	QFLAG;	Zero the flag once it's sent.
   777                  ; If an interrupt occurs between this OUT and STA, with the host asking for a
   778                  ; current status report, we will transmit bit 1 = 1 instead of 0;
   779                  ; but the host will understand, since it just got the acknowledgment.
   780                  
   781  742D  3A107F    GET0:	LDA	DQACK
   782  7430  BD        	CMP	L
   783  7431  CA0074    	JZ	GET;	Wait until the DQ input buffer is nonempty.
   784                  
   785  7434  7E        	MOV	A,M;	Fetch the next byte
   786  7435  2C        	INR	L
   787  7436  22127F    	SHLD	DQOUT;	Advance the buffer pointer (wrapping mod 256).
   788  7439  C9        	RET
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 9

   789                  ; A program that prepares to typeset a character.
   790                  
   791  743A  4F        TYPST:	MOV	C,A;	Typeset-character command:
   792  743B  3A0D7F    TYP1:	LDA	READY
   793  743E  FE02      	CPI	2
   794  7440  D23B74    	JNC	TYP1;	Wait until READY<2.
   795                  
   796  7443  2A277F    	LHLD	LBIN
   797  7446  71        	MOV	M,C;	Store the character in LB.
   798                  
   799  7447  69        	MOV	L,C
   800  7448  2600      	MVI	H,0
   801  744A  29        	DAD	H
   802  744B  29        	DAD	H
   803  744C  111081    	LXI	D,CTB-10
   804  744F  19        	DAD	D;	HL←CTB table address for character.
   805  7450  5E        	MOV	E,M
   806  7451  23        	INX	H
   807  7452  56        	MOV	D,M;	DE←repertoire address for character.
   808  7453  210500    	LXI	H,5
   809  7456  19        	DAD	D;	HL←address of byte 6.
   810                  
   811  7457  5E        	MOV	E,M
   812  7458  23        	INX	H
   813  7459  7E        	MOV	A,M
   814  745A  E607      	ANI	111B
   815  745C  57        	MOV	D,A;	DE←horizontal multiplier.
   816  745D  D5        	PUSH	D
   817                  
   818  745E  21002D    	LXI	H,360*32
   819  7461  CDA87D    	CALL	MULTD;	HL←[360a].
   820  7464  E5        	PUSH	H
   821                  
   822  7465  CD0074    	CALL	GET
   823  7468  5F        	MOV	E,A
   824  7469  CD0074    	CALL	GET
   825  746C  57        	MOV	D,A;	DE←desired character position in dot units.
   826                  
   827  746D  CD0074    	CALL	GET
   828  7470  4F        	MOV	C,A;	C←left cog increment.
   829  7471  CD0074    	CALL	GET
   830  7474  47        	MOV	B,A;	B←right cog increment.
   831                  
   832  7475  3AE27F    	LDA	STATE
   833  7478  B7        	ORA	A
   834  7479  FA7F74    	JM	TYP3;	jump if LR state.
   835                  
   836  747C  79        	MOV	A,C;	interchange left and right increments.
   837  747D  48        	MOV	C,B
   838  747E  47        	MOV	B,A
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 9-2

   839                  
   840  747F  E1        TYP3:	POP	H
   841  7480  CD987D    	CALL	SUBD;	DE←xshift.
   842  7483  E1        	POP	H;	HL←xmult.
   843                  
   844  7484  7A        	MOV	A,D
   845  7485  E607      	ANI	111B;	Compute and pack the msbs of xshift and xmult.
   846  7487  0F        	RRC
   847  7488  0F        	RRC
   848  7489  0F        	RRC
   849  748A  0F        	RRC
   850  748B  B4        	ORA	H;	Now AE = xshift (will be stored in line buffer, msb first).
   851  748C  2A277F    	LHLD	LBIN
   852  748F  23        	INX	H
   853  7490  77        	MOV	M,A
   854  7491  23        	INX	H
   855  7492  73        	MOV	M,E
   856  7493  97        	SUB	A
   857  7494  57        	MOV	D,A
   858  7495  58        	MOV	E,B
   859                  
   860                  ; Now we have AC = starting cog increment, DE = ending cog increment,
   861                  ; 	and CB = bytes to be stored.
   862                  
   863  7496  23        TYP2:	INX	H
   864  7497  71        	MOV	M,C
   865  7498  23        	INX	H
   866  7499  70        	MOV	M,B
   867  749A  47        	MOV	B,A
   868  749B  23        	INX	H
   869                  
   870  749C  3AE27F    	LDA	STATE
   871  749F  B7        	ORA	A
   872  74A0  FAB774    	JM	TYP4;	Jump if LR state.
   873                  
   874  74A3  E5        	PUSH	H
   875  74A4  2A2B7F    	LHLD	RLI
   876  74A7  09        	DAD	B
   877  74A8  222B7F    	SHLD	RLI
   878  74AB  2A2D7F    	LHLD	RLJ
   879  74AE  19        	DAD	D
   880  74AF  222D7F    	SHLD	RLJ;	Update cog accumulators for RL setting.
   881                  
   882  74B2  11F6FF    	LXI	D,-10
   883  74B5  E1        	POP	H
   884  74B6  19        	DAD	D;	RL state moves right to left in LB.
   885  74B7  22277F    TYP4:	SHLD	LBIN;	Update line buffer position.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 10

   886                  ; The main scanning loop, beginning a new instruction:
   887                  
   888                  ; (Control "falls through" to here from the program on the previous page.)
   889  74BA  CD0074    READ:	CALL	GET;	A←first byte.
   890  74BD  FE02      	CPI	2
   891  74BF  D24D75    	JNC	READ1;	Jump if 2 or more.
   892                  
   893  74C2  B7        	ORA	A
   894  74C3  C22476    	JNZ	CMULT;	Jump if 1.
   895                  
   896  74C6  CD0074    	CALL	GET;	A←second byte.
   897  74C9  FE02      	CPI	2
   898  74CB  D2E774    	JNC	READ2;	Jump if 2 or more.
   899                  
   900  74CE  B7        	ORA	A
   901  74CF  C2067A    	JNZ	BPAGE;	Jump if 1.
   902                  
   903  74D2  CD0074    	CALL	GET;	A←third byte.
   904  74D5  B7        	ORA	A
   905  74D6  CA5A76    	JZ	ADJC;	Jump if 0.
   906                  
   907  74D9  4F        DISPM:	MOV	C,A;	Display-message command:
   908  74DA  CD0074    DISP1:	CALL	GET
   909  74DD  CD2302    	CALL	DC;	Display one character.
   910  74E0  0D        	DCR	C
   911  74E1  C2DA74    	JNZ	DISP1
   912  74E4  C3BA74    	JMP	READ
   913                  
   914  74E7  CA7D7A    READ2:	JZ	EOL;	Jump if 2.
   915                  
   916  74EA  6F        NEWCH:	MOV	L,A;	New-character command:
   917  74EB  2600      	MVI	H,0
   918  74ED  29        	DAD	H
   919  74EE  29        	DAD	H;	HL←character code times 4.
   920                  
   921  74EF  110E81    	LXI	D,CTB-12
   922  74F2  19        	DAD	D
   923  74F3  E5        	PUSH	H;	Save CTB table location for the new character.
   924                  
   925  74F4  CD0074    	CALL	GET
   926  74F7  5F        	MOV	E,A
   927  74F8  CD0074    	CALL	GET
   928  74FB  57        	MOV	D,A;	DE←location in repertoire.
   929                  
   930  74FC  CD0074    	CALL	GET
   931  74FF  4F        	MOV	C,A
   932  7500  CD0074    	CALL	GET
   933  7503  47        	MOV	B,A;	BC←number of boundary data bytes.
   934                  
   935  7504  E1        	POP	H
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 10-2

   936  7505  C5        	PUSH	B;	Save number of bytes.
   937                  
   938  7506  71        	MOV	M,C;	Store length in CTB table.
   939  7507  23        	INX	H
   940  7508  70        	MOV	M,B
   941  7509  23        	INX	H
   942                  
   943  750A  73        	MOV	M,E;	Store repertoire location in CTB table.
   944  750B  23        	INX	H
   945  750C  72        	MOV	M,D
   946                  
   947  750D  97        	SUB	A
   948  750E  B1        	ORA	C;	Prepare to loop BC times.
   949  750F  CA1375    	JZ	NEW1
   950  7512  04        	INR	B
   951                  
   952  7513  CD0074    NEW1:	CALL	GET;	DE=address for next byte.
   953  7516  12        	STAX	D
   954  7517  13        	INX	D
   955  7518  0D        	DCR	C
   956  7519  C21375    	JNZ	NEW1
   957  751C  05        	DCR	B
   958  751D  C21375    	JNZ	NEW1
   959                  
   960  7520  97        	SUB	A;	Now store the three final bytes.
   961  7521  12        	STAX	D
   962  7522  13        	INX	D
   963  7523  12        	STAX	D
   964  7524  13        	INX	D
   965  7525  3EF8      	MVI	A,11111000B
   966  7527  12        	STAX	D
   967                  
   968  7528  E1        	POP	H
   969  7529  CD987D    	CALL	SUBD;	DE←address of third byte of boundary data.
   970  752C  210300    	LXI	H,3
   971  752F  19        	DAD	D;	HL←address of byte 6.
   972                  
   973  7530  3A177F    	LDA	AMULT;	store horizontal multiplier.
   974  7533  77        	MOV	M,A
   975  7534  23        	INX	H
   976  7535  3A187F    	LDA	AMULT+1
   977  7538  77        	MOV	M,A
   978  7539  23        	INX	H
   979                  
   980  753A  3A197F    	LDA	BMULT;	store vertical multiplier.
   981  753D  77        	MOV	M,A
   982                  
   983  753E  23        	INX	H
   984  753F  3A1B7F    	LDA	YSBM
   985  7542  77        	MOV	M,A;	Store msb of yshift and ymult.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 10-3

   986                  
   987  7543  23        	INX	H
   988  7544  23        	INX	H
   989  7545  23        	INX	H
   990  7546  3A1A7F    	LDA	YSHFT
   991  7549  77        	MOV	M,A;	Store lsb of yshift.
   992  754A  C3BA74    	JMP	READ;	Done inputting the new character, go to next instruction.
   993                  
   994  754D  C23A74    READ1:	JNZ	TYPST;	Jump if 3 or more.
   995  7550  CD0074    	CALL	GET;	A←second byte.
   996  7553  FE02      	CPI	2
   997  7555  DA8B75    	JC	READ3;	Jump if 0 or 1.
   998  7558  CA1276    	JZ	FEED;	Jump if 2.
   999                  
  1000  755B  6F        SHUFF:	MOV	L,A;	Shuffle command:
  1001  755C  2600      	MVI	H,0
  1002  755E  29        	DAD	H
  1003  755F  29        	DAD	H
  1004  7560  110E81    	LXI	D,CTB-12
  1005  7563  19        	DAD	D
  1006  7564  E5        	PUSH	H;	Save CTB location for character to be moved.
  1007                  
  1008  7565  CD0074    	CALL	GET
  1009  7568  5F        	MOV	E,A
  1010  7569  CD0074    	CALL	GET
  1011  756C  57        	MOV	D,A;	DE←new location.
  1012                  
  1013  756D  E1        	POP	H
  1014  756E  4E        	MOV	C,M
  1015  756F  23        	INX	H
  1016  7570  46        	MOV	B,M;	BC←number of boundary bytes.
  1017                  
  1018  7571  03        	INX	B
  1019  7572  03        	INX	B
  1020  7573  03        	INX	B
  1021  7574  C5        	PUSH	B;	Save the number of bytes to move.
  1022                  
  1023  7575  3A0D7F    SHUF1:	LDA	READY;	Wait until READY=0.
  1024  7578  B7        	ORA	A
  1025  7579  C27575    	JNZ	SHUF1
  1026                  
  1027  757C  23        	INX	H;	Store new location in CTB table, prior to moving,
  1028  757D  4E        	MOV	C,M;	   meanwhile setting BC←old location.
  1029  757E  73        	MOV	M,E
  1030  757F  23        	INX	H
  1031  7580  46        	MOV	B,M
  1032  7581  72        	MOV	M,D
  1033                  
  1034  7582  69        	MOV	L,C
  1035  7583  60        	MOV	H,B
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 10-4

  1036  7584  C1        	POP	B
  1037  7585  CDDC7D    	CALL	MOVE;	Move the data.
  1038  7588  C3BA74    	JMP	READ;	Advance to next command.
  1039                  
  1040  758B  B7        READ3:	ORA	A
  1041  758C  C2C973    	JNZ	EOF;	Jump if 1.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 11

  1042                  ; Program to set a specified beam brightness.
  1043                  
  1044                  ; (Control "falls through" from the READ routine on the preceding page.)
  1045  758F  CD0074    BRITE:	CALL	GET;	Change-brightness command:
  1046  7592  5F        	MOV	E,A
  1047  7593  CD0074    	CALL	GET
  1048  7596  57        	MOV	D,A;	DE←brightness parameter (0 to 3000).
  1049                  
  1050  7597  3A0D7F    BRIT1:	LDA	READY
  1051  759A  21C27F    	LXI	H,LMBSY
  1052  759D  B6        	ORA	M
  1053  759E  21C37F    	LXI	H,FMBSY
  1054  75A1  B6        	ORA	M
  1055  75A2  C29775    	JNZ	BRIT1;	Wait until READY=LMBSY=FMBSY=0.
  1056                  
  1057  75A5  D5        	PUSH	D
  1058  75A6  21343C    	LXI	H,3C34H;	(.2351628457)
  1059  75A9  CDA87D    	CALL	MULTD;	Multiply by exposure correction factor, giving HL = y, say.
  1060                  
  1061  75AC  29        	DAD	H
  1062  75AD  29        	DAD	H
  1063  75AE  29        	DAD	H
  1064  75AF  29        	DAD	H
  1065  75B0  29        	DAD	H
  1066  75B1  7C        	MOV	A,H;	A ← [y/8] = z, say.
  1067  75B2  29        	DAD	H;	HL ← 64y.
  1068                  
  1069  75B3  F5        	PUSH	PSW
  1070  75B4  2F        	CMA
  1071  75B5  5F        	MOV	E,A
  1072  75B6  16FF      	MVI	D,-1
  1073  75B8  13        	INX	D;	DE ← -z.
  1074                  
  1075  75B9  D398      	OUT	BEAMR;	Reset beam position.
  1076  75BB  011D7F    	LXI	B,BTLS
  1077  75BE  0A        	LDAX	B
  1078  75BF  F620      	ORI	20H
  1079  75C1  02        	STAX	B;	Set lens motor moving to the right
  1080  75C2  D3DA      	OUT	BTLCH;	  (so that the beam steps to the right).
  1081                  
  1082  75C4  010000    	LXI	B,0;	Now comes a loop to set the brightness increments.
  1083  75C7  DBDF      BRIT2:	IN	BSTEP;	Step the beam.
  1084  75C9  03        	INX	B
  1085  75CA  79        	MOV	A,C
  1086  75CB  E60F      	ANI	0FH
  1087  75CD  C2C775    	JNZ	BRIT2
  1088  75D0  7C        	MOV	A,H;	Every 16 steps, store H in the brightness-increment memory.
  1089  75D1  2F        	CMA
  1090  75D2  D388      	OUT	BRT1
  1091  75D4  D3A0      	OUT	BRT2
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 11-2

  1092                  
  1093  75D6  19        	DAD	D;	HL ← HL plus or minus z.
  1094  75D7  78        	MOV	A,B
  1095  75D8  D620      	SUI	20H
  1096  75DA  C2E275    	JNZ	BRIT3
  1097                  
  1098  75DD  57        	MOV	D,A;	Now BC = 2000H, we have stored 512 bytes.
  1099  75DE  F1        	POP	PSW
  1100  75DF  5F        	MOV	E,A;	Set DE ← +z.
  1101                  
  1102  75E0  0680      	MVI	B,80H;	This is a dirty trick, it sets BC←8000H.
  1103  75E2  FE80      BRIT3:	CPI	80H
  1104  75E4  C2C775    	JNZ	BRIT2;	Jump if we haven't stored 1024 bytes.
  1105                  
  1106  75E7  2A517F    	LHLD	LMP;	Now move beam back into proper position.
  1107  75EA  115BFC    	LXI	D,-933
  1108  75ED  19        	DAD	D
  1109  75EE  7C        	MOV	A,H
  1110  75EF  E63F      	ANI	3FH
  1111  75F1  67        	MOV	H,A
  1112  75F2  7D        	MOV	A,L
  1113  75F3  B7        	ORA	A
  1114  75F4  CAF875    	JZ	BRIT4;	Prepare to loop (LMP-933) mod 16192 times.
  1115  75F7  24        	INR	H
  1116  75F8  DBDF      BRIT4:	IN	BSTEP
  1117  75FA  2D        	DCR	L
  1118  75FB  C2F875    	JNZ	BRIT4
  1119  75FE  25        	DCR	H
  1120  75FF  C2F875    	JNZ	BRIT4
  1121                  
  1122  7602  E1        	POP	H;	Set overall brightness.
  1123  7603  11FF03    	LXI	D,1023
  1124  7606  19        	DAD	D
  1125  7607  7D        	MOV	A,L
  1126  7608  2F        	CMA
  1127  7609  D388      	OUT	BRT1
  1128  760B  7C        	MOV	A,H
  1129  760C  2F        	CMA
  1130  760D  D390      	OUT	BRT1+8
  1131  760F  C3BA74    	JMP	READ;	Go on to the next command.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 12

  1132                  ; Programs for simple adjustment commands.
  1133                  
  1134  7612  CD0074    FEED:	CALL	GET;	Feed command:
  1135  7615  5F        	MOV	E,A
  1136  7616  CD0074    	CALL	GET
  1137  7619  57        	MOV	D,A;	DE←amount to feed (in feed motor units).
  1138                  
  1139  761A  2A257F    	LHLD	YBASE
  1140  761D  19        	DAD	D
  1141  761E  22257F    	SHLD	YBASE;	Update current value of YBASE.
  1142  7621  C3BA74    	JMP	READ;	Go on to the next command.
  1143                  
  1144  7624  CD0074    CMULT:	CALL	GET;	Change-multipliers command:
  1145  7627  5F        	MOV	E,A
  1146  7628  CD0074    	CALL	GET
  1147  762B  57        	MOV	D,A
  1148  762C  EB        	XCHG
  1149  762D  22177F    	SHLD	AMULT;	Store new horizontal multiplier.
  1150                  
  1151  7630  CD0074    	CALL	GET
  1152  7633  5F        	MOV	E,A
  1153  7634  CD0074    	CALL	GET
  1154  7637  57        	MOV	D,A
  1155  7638  F5        	PUSH	PSW
  1156  7639  EB        	XCHG
  1157  763A  22197F    	SHLD	BMULT;	Store new vertical multiplier.
  1158                  
  1159  763D  11202E    	LXI	D,369*32
  1160  7640  CDA87D    	CALL	MULTD;	HL←[369b].
  1161  7643  110501    	LXI	D,261
  1162  7646  CD987D    	CALL	SUBD;	DE←yshift.
  1163                  
  1164  7649  7A        	MOV	A,D
  1165  764A  E607      	ANI	00000111B
  1166  764C  0F        	RRC
  1167  764D  0F        	RRC
  1168  764E  0F        	RRC
  1169  764F  0F        	RRC	;	Rotate four bits.
  1170  7650  E1        	POP	H
  1171  7651  B4        	ORA	H;	Pack leading bits of yshift and the multiplier.
  1172  7652  57        	MOV	D,A
  1173  7653  EB        	XCHG
  1174  7654  221A7F    	SHLD	YSHFT
  1175                  
  1176  7657  C3BA74    	JMP	READ;	Go on to the next command.
  1177                  
  1178  765A  3A0D7F    ADJC:	LDA	READY;	Adjust-cogs command:
  1179  765D  FE02      	CPI	2
  1180  765F  D25A76    	JNC	ADJC;	Wait until READY<2.
  1181                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 12-2

  1182  7662  CD0074    	CALL	GET
  1183  7665  4F        	MOV	C,A
  1184  7666  CD0074    	CALL	GET
  1185  7669  47        	MOV	B,A;	BC←amount of adjustment.
  1186                  
  1187  766A  1E00      	MVI	E,0
  1188  766C  2A277F    	LHLD	LBIN
  1189  766F  73        	MOV	M,E;	Store three zero bytes in the line buffer.
  1190  7670  23        	INX	H
  1191  7671  73        	MOV	M,E
  1192  7672  23        	INX	H
  1193  7673  73        	MOV	M,E
  1194                  
  1195  7674  50        	MOV	D,B
  1196  7675  59        	MOV	E,C
  1197  7676  C39674    	JMP	TYP2;	Go to common routine with the Typeset command.
  1198                  	
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 13

  1199                  ; Interrupt handling for data received from computer or operator.
  1200                  
  1201  0069            MAGIC	EQU	01101001B;	Specially flagged byte for protocol.
  1202                  
  1203  7679  F5        RDIS:	PUSH	PSW;	RS232 data interrupt service:
  1204  767A  E5        	PUSH	H
  1205  767B  D5        	PUSH	D
  1206  767C  21167F    	LXI	H,MFLAG;	Look at protocol's magic-word flag.
  1207  767F  7E        	MOV	A,M
  1208  7680  FE69      	CPI	MAGIC
  1209  7682  DB80      	IN	RS232;	Read in the new data.
  1210  7684  CAB176    	JZ	PRTCL;	Jump if MFLAG = magic.
  1211                  
  1212  7687  77        	MOV	M,A;	MFLAG gets new data byte.
  1213  7688  FE69      	CPI	MAGIC;	Not in magic mode yet, check if magic word.
  1214  768A  CA5977    	JZ	POP3;	Wait for second byte--the magic command.
  1215                  
  1216  768D  2A0E7F    RDATA:	LHLD	DQIN;	Just data, look at queue now.
  1217  7690  77        	MOV	M,A;	Store new byte of data.
  1218                  
  1219  7691  EB        	XCHG	;	DE←DQIN.
  1220  7692  210B7F    	LXI	H,SUMCH
  1221  7695  86        	ADD	M
  1222  7696  77        	MOV	M,A;	Update the sum check.
  1223                  
  1224  7697  EB        	XCHG	;	HL←DQIN.
  1225  7698  2C        	INR	L;	Advance line buffer pointer (wrapping mod 256).
  1226  7699  3A127F    	LDA	DQOUT
  1227  769C  BD        	CMP	L
  1228  769D  CAA676    	JZ	OVRUN;	Jump if buffer was already full (contained 255 bytes).
  1229                  	
  1230  76A0  220E7F    	SHLD	DQIN
  1231  76A3  C35977    	JMP	POP3;	Restore registers and return from the interrupt.
  1232                  
  1233  76A6  1610      OVRUN:	MVI	D,00010000B;   Set overrun flag.
  1234  76A8  21147F    BAD:	LXI	H,OVFLG;       Input character will be dropped (DQIN not updated).
  1235  76AB  7E        	MOV	A,M;
  1236  76AC  B2        	ORA	D;	(Either of two errors here.)
  1237  76AD  77        	MOV	M,A
  1238  76AE  C35977    	JMP	POP3;	Restore registers and return.
  1239                  
  1240  76B1  3600      PRTCL:	MVI	M,0;	Reset MFLAG.
  1241                  
  1242  76B3  FE69      	CPI	MAGIC
  1243  76B5  CA8D76    	JZ	RDATA;	Just a quoted character with the magic code 69H.
  1244                  
  1245  76B8  FE02      	CPI	10B
  1246  76BA  CA0F77    	JZ	AQUIT;	We just got a request to abort.
  1247  76BD  DAC576    	JC	ZORO;	Command is 0 or 1.
  1248                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 13-2

  1249  76C0  1640      	MVI	D,01000000B;	Byte > 2, but not 69H, must be sumcheck error.
  1250  76C2  C3A876    	JMP	BAD;	Store the error in OVFLG at BAD.
  1251                  
  1252  76C5  B7        ZORO:	ORA	A
  1253  76C6  C21777    	JNZ	RPORT;	Command=1, report our status.
  1254                  
  1255  76C9  210B7F    	LXI	H,SUMCH
  1256  76CC  7E        	MOV	A,M;	Get the sum check as of byte before 69H,0H pair.
  1257  76CD  3600      	MVI	M,0;	Set SUMCH←0.
  1258                  
  1259  76CF  B7        	ORA	A
  1260  76D0  21147F    	LXI	H,OVFLG
  1261  76D3  7E        	MOV	A,M
  1262  76D4  CAD976    	JZ	RDIS4;	Jump if sum check was OK.
  1263  76D7  F640      	ORI	01000000B;   Set bit indicating sum check failure.
  1264                  
  1265  76D9  57        RDIS4:	MOV	D,A;	Save error bits.
  1266  76DA  3600      	MVI	M,0;	Clear OVFLG.
  1267                  
  1268  76DC  21157F    	LXI	H,QFLAG
  1269  76DF  7E        	MOV	A,M
  1270  76E0  B7        	ORA	A
  1271  76E1  C25977    	JNZ	POP3;	Return without acknowledgment if abort is pending.
  1272                  
  1273  76E4  DB81      	IN	RS232+1;   Read state of USART chip.
  1274                  
  1275  76E6  E630      	ANI	00110000B
  1276  76E8  B2        	ORA	D;	   Merge error flags.
  1277  76E9  57        	MOV	D,A
  1278                  
  1279  76EA  0F        	RRC
  1280  76EB  0F        	RRC
  1281  76EC  0F        	RRC
  1282  76ED  0F        	RRC
  1283  76EE  B2        	ORA	D
  1284  76EF  EEF0      	XRI	11110000B
  1285  76F1  32157F    	STA	QFLAG;	   Set QFLAG to acknowledgment byte with error flags.
  1286                  
  1287  76F4  E607      	ANI	111B
  1288  76F6  210E7F    	LXI	H,DQIN
  1289  76F9  C20477    	JNZ	RDIS6;	   Jump if there was an error.
  1290                  
  1291  76FC  35        	DCR	M;	Decrease DQIN (i.e., drop the sum check byte).
  1292  76FD  7E        	MOV	A,M
  1293  76FE  32107F    	STA	DQACK;	Set DQACK←DQIN (i.e., accept the last block).
  1294  7701  C35977    	JMP	POP3;	   Return from interrupt.
  1295                  
  1296  7704  3E37      RDIS6:	MVI	A,00110111B;
  1297  7706  D381      	OUT	RS232+1;   Reset error flags in USART chip.
  1298  7708  3A107F    	LDA	DQACK
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 13-3

  1299  770B  77        	MOV	M,A;	   Set DQIN←DQACK (i.e., reject the last block).
  1300  770C  C35977    	JMP	POP3;	   Return from interrupt.
  1301                  
  1302  770F  3E0F      AQUIT:	MVI	A,00001111B
  1303  7711  32157F    	STA	QFLAG;	Set flag so we will know to abort.
  1304  7714  C35977    	JMP	POP3
  1305                  
  1306  7717  165A      RPORT:	MVI	D,01011010B; Set rD ← status report with ack pending.
  1307  7719  3A157F    	LDA	QFLAG;	Negative QFLAG means we'll acknowledge shortly.
  1308  771C  B7        	ORA	A
  1309  771D  FA2577    	JM	RPRT0
  1310  7720  C22F77    	JNZ	RPRT1;	Positive nonzero QFLAG is ABORT code, send one now.
  1311  7723  1678      	MVI	D,01111000B; Set rD ← status report with ack not pending.
  1312                  
  1313  7725  3A1C7F    RPRT0:	LDA	MSLS
  1314  7728  B7        	ORA	A
  1315  7729  7A        	MOV	A,D;	Copy report byte from D.
  1316  772A  F22F77    	JP	RPRT1;	The sign of MSLS is set if waiting for film-change.
  1317  772D  EE11      	XRI	00010001B
  1318                  
  1319  772F  D380      RPRT1:	OUT	RS232;	Send the status report and continue on.
  1320  7731  C35977    	JMP	POP3
  1321                  
  1322                  
  1323  7734  F5        KBIS1:	PUSH	PSW;	Keyboard interrupt service when on-line:
  1324  7735  E5        	PUSH	H
  1325                  
  1326  7736  DBDD      	IN	DISPL
  1327  7738  E60F      	ANI	0FH;	Read keyboard code.
  1328  773A  210C7F    	LXI	H,KBIB1
  1329  773D  FE09      	CPI	9
  1330  773F  C24D77    	JNZ	KBIS2;	Jump if not "0".
  1331                  
  1332  7742  7E        	MOV	A,M
  1333  7743  FE05      	CPI	5
  1334  7745  C24D77    	JNZ	KBIS2;	Jump if previous was not "3".
  1335                  
  1336  7748  3E0F      	MVI	A,00001111B
  1337  774A  32157F    	STA	QFLAG;	Prepare to abort when scanning resumes.
  1338                  ; `CALL DEBUG' or `JMP QUIT' could be substituted for `STA QFLAG' when debugging.
  1339                  
  1340  774D  77        KBIS2:	MOV	M,A;	Store the code in KBIB1.
  1341  774E  C35A77    	JMP	POP2;	Restore registers and return from the interrupt.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 14

  1342                  ; Lens motor control routines:
  1343                  
  1344  7751  F5        LMIS:	PUSH	PSW;	Lens motor interrupt service:
  1345  7752  E5        	PUSH	H
  1346  7753  D5        	PUSH	D
  1347  7754  C5        	PUSH	B
  1348  7755  CDC477    	CALL	LCYC;	Do one lens cycle.
  1349                  
  1350  7758  C1        POP4:	POP	B;	Return from interrupt, restoring all four register pairs.
  1351  7759  D1        POP3:	POP	D
  1352  775A  E1        POP2:	POP	H
  1353  775B  3E20      	MVI	A,20H
  1354  775D  F3        	DI
  1355  775E  D3C0      	OUT	INT;	Remove current bit from interrupt status register.
  1356                  
  1357  7760  DBC0      	IN	INT;	A ← bits for other interrupts in service, if any.
  1358  7762  B7        	ORA	A
  1359  7763  CA6677    ISW:	JZ	ISW0;	This address is modified if low-priority routine scheduled.
  1360                  
  1361                  ; Note that low-priority routines must not be entered when an interrupt was
  1362                  ; interrupted, since the interrupt service register in the 8259 chip must
  1363                  ; record the true "fully nested" state of what interrupts are being serviced.
  1364  7766  F1        ISW0:	POP	PSW
  1365  7767  FB        	EI
  1366  7768  C9        	RET	;	Return from interrupt.
  1367                  
  1368                  ; The following subroutine begins a chain of events that will move the lens
  1369                  ; motor to position DE, including all necessary acceleration and deceleration.
  1370                  ; If A=0, the typesetting of a line will also be initiated at the proper time.
  1371  7769  3E01      LGO0:	MVI	A,1;	Special case of LGO when not typesetting.
  1372  776B  32537F    LGO:	STA	LTYPE
  1373                  
  1374  776E  2A517F    	LHLD	LMP;	HL←lens motor current position (in motor steps from home).
  1375  7771  CD927D    	CALL	CMPD
  1376  7774  C8        	RZ	;	Return if already there.
  1377                  
  1378  7775  EB        	XCHG
  1379  7776  22517F    	SHLD	LMP;	Store the position to be moved to.
  1380                  
  1381  7779  011D7F    	LXI	B,BTLS
  1382  777C  0A        	LDAX	B
  1383  777D  DA8677    	JC	LGO1;	Jump if movement will be towards the left (LMP decreasing).
  1384                  
  1385  7780  F620      	ORI	00100000B;	Set lens motor direction = right.
  1386  7782  EB        	XCHG	;	Interchange so that HL≤DE.
  1387  7783  C38877    	JMP	LGO2
  1388                  
  1389  7786  E6DF      LGO1:	ANI	11011111B;	Set lens motor direction = left.
  1390  7788  02        LGO2:	STAX	B
  1391  7789  D3DA      	OUT	BTLCH
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 14-2

  1392                  
  1393  778B  CD987D    	CALL	SUBD;	DE←number of motor steps needed, say n.
  1394  778E  D5        	PUSH	D
  1395                  
  1396  778F  1B        	DCX	D
  1397  7790  1B        	DCX	D
  1398  7791  7B        	MOV	A,E
  1399  7792  E6FC      	ANI	11111100B;	Truncate n-2 to a multiple of 4.
  1400  7794  5F        	MOV	E,A
  1401                  
  1402  7795  215001    	LXI	H,84*4
  1403  7798  CD927D    	CALL	CMPD
  1404  779B  D29F77    	JNC	LGO3;	Jump if (n-2)/4≥84.
  1405                  
  1406  779E  EB        	XCHG
  1407  779F  D1        LGO3:	POP	D;	Now HL is 4 times the number of acceleration cycles (≤4*84).
  1408  77A0  CD987D    	CALL	SUBD;	Set DE ← n-HL = number of steps at top speed (≥2).
  1409  77A3  EB        	XCHG
  1410  77A4  225A7F    	SHLD	LSTEP
  1411                  
  1412  77A7  7A        	MOV	A,D
  1413  77A8  0F        	RRC
  1414  77A9  7B        	MOV	A,E
  1415  77AA  1F        	RAR
  1416  77AB  5F        	MOV	E,A;	Set E ← twice the number of acceleration cycles (mod 256).
  1417                  
  1418  77AC  210F7E    	LXI	H,TABLE
  1419  77AF  22587F    	SHLD	LRATE;	Initialize the rate pointer.
  1420  77B2  19        	DAD	D
  1421  77B3  2600      	MVI	H,0
  1422  77B5  22567F    	SHLD	LLIM;	Set LLIM←lsb of top-speed rate address, and set LSTAT←0.
  1423                  
  1424  77B8  CDEF7D    	CALL	DELAY2;	Make sure lens motor is resting.
  1425  77BB  CDC477    	CALL	LCYC;	Do the first lens motor cycle.
  1426                  
  1427  77BE  3E01      	MVI	A,1
  1428  77C0  32C27F    	STA	LMBSY;	Mark lens motor busy.
  1429  77C3  C9        	RET	;	Return from the subroutine.
  1430                  
  1431                  ; LSTAT=0 when accelerating, =1 at top speed, >1 when decelerating.
  1432                  
  1433  77C4  3A577F    LCYC:	LDA	LSTAT;	Subroutine to do one lens motor cycle:
  1434  77C7  B7        	ORA	A
  1435  77C8  C21E78    	JNZ	LCYC1;	Jump if not accelerating.
  1436                  
  1437  77CB  3A567F    	LDA	LLIM
  1438  77CE  2A587F    	LHLD	LRATE
  1439  77D1  BD        	CMP	L;	(least significant bytes suffice for comparison)
  1440                  
  1441  77D2  5E        	MOV	E,M
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 14-3

  1442  77D3  23        	INX	H
  1443  77D4  56        	MOV	D,M;	DE ← current rate from table.
  1444  77D5  CAFB77    	JZ	LCYC2;	Jump if maximum rate achieved.
  1445                  	
  1446  77D8  23        	INX	H
  1447  77D9  22587F    LCYC3:	SHLD	LRATE;	Update location of next rate.
  1448                  
  1449  77DC  210100    	LXI	H,1;	Take two steps.
  1450                  
  1451  77DF  3E70      LCYCS:	MVI	A,70H
  1452  77E1  D3CB      	OUT	LTIMR+3;    Prepare for lens motor interrupt,
  1453  77E3  7D        	MOV	A,L
  1454  77E4  D3C9      	OUT	LTIMR+1
  1455  77E6  7C        	MOV	A,H
  1456  77E7  D3C9      	OUT	LTIMR+1;	after HL+1 steps.
  1457                  
  1458  77E9  3AC27F    	LDA	LMBSY
  1459  77EC  B7        	ORA	A
  1460  77ED  C2F477    	JNZ	LCYC4;	Jump if not the first cycle.
  1461  77F0  3E34      	MVI	A,34H
  1462  77F2  D3CB      	OUT	LTIMR+3;    Stop the rate counter until it is loaded.
  1463                  
  1464  77F4  7B        LCYC4:	MOV	A,E
  1465  77F5  D3C8      	OUT	LTIMR
  1466  77F7  7A        	MOV	A,D
  1467  77F8  D3C8      	OUT	LTIMR;	Load rate DE.
  1468  77FA  C9        	RET	;	Return from subroutine or subsubroutine.
  1469                  
  1470  77FB  2A5A7F    LCYC2:	LHLD	LSTEP;	HL←number of steps to take at top speed.
  1471  77FE  2B        	DCX	H
  1472  77FF  CDDF77    	CALL	LCYCS
  1473                  
  1474  7802  3A537F    	LDA	LTYPE
  1475  7805  B7        	ORA	A
  1476  7806  C21878    	JNZ	LCYC5;	Jump if not setting a line.
  1477                  
  1478  7809  3E04      	MVI	A,4
  1479  780B  32557F    	STA	GTYPE
  1480  780E  3A337F    	LDA	CORR
  1481  7811  D3CA      	OUT	GTIMR
  1482  7813  3A347F    	LDA	CORR+1
  1483  7816  D3CA      	OUT	GTIMR;	Set up timer interrupt that will enable output GO.
  1484                  
  1485  7818  3E01      LCYC5:	MVI	A,1;	Set LSTAT = top speed (1).
  1486  781A  32577F    	STA	LSTAT
  1487  781D  C9        	RET	;	Return from subroutine.
  1488                  
  1489  781E  3E0F      LCYC1:	MVI	A,TABLE AND 0FFH
  1490  7820  32577F    	STA	LSTAT;	We are assuming that this is not 0 or 1!
  1491  7823  2A587F    	LHLD	LRATE
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 14-4

  1492  7826  BD        	CMP	L
  1493  7827  CA3178    	JZ	LCYC7;	Jump if minimum speed encountered.
  1494                  
  1495  782A  2B        	DCX	H
  1496  782B  56        	MOV	D,M
  1497  782C  2B        	DCX	H
  1498  782D  5E        	MOV	E,M
  1499  782E  C3D977    	JMP	LCYC3;	Perform the next deceleration cycle.
  1500                  
  1501  7831  3E34      LCYC7:	MVI	A,34H
  1502  7833  D3CB      	OUT	LTIMR+3;   Stop the motor.
  1503  7835  3E70      	MVI	A,70H
  1504  7837  D3CB      	OUT	LTIMR+3
  1505                  
  1506  7839  97        	SUB	A
  1507  783A  32C27F    	STA	LMBSY;	Clear LMBSY.
  1508                  
  1509                  ; If rA is nonzero on entrance to CHBOL, we aren't servicing an interrupt.
  1510  783D  F5        CHBOL:	PUSH	PSW;	Subroutine to check if new line can begin immediately.
  1511  783E  3A0D7F    	LDA	READY
  1512  7841  B7        	ORA	A
  1513  7842  CAE27B    	JZ	POP1L;	Return if READY=0.
  1514                  
  1515  7845  3AC27F    	LDA	LMBSY
  1516  7848  211E7F    	LXI	H,FFLAG
  1517  784B  B6        	ORA	M
  1518  784C  23        	INX	H
  1519  784D  B6        	ORA	M
  1520  784E  C2E27B    	JNZ	POP1L;	Return if LMBSY or FFLAG or LIP is nonzero.
  1521                  
  1522                  ; It can be proved that a line won't be "begun" twice by this routine, because
  1523                  ; LIP was fetched after LMBSY and FFLAG. (But there would have been a problem
  1524                  ; if LIP had been fetched first! Namely if CHBOL is, say, being called by EOL,
  1525                  ; and if after fetching LIP=0 an interrupt makes FFLAG=0 or LMBSY=0.)
  1526                  
  1527  7851  34        	INR	M;	Set LIP ← 1.
  1528  7852  F1        	POP	PSW
  1529  7853  B7        	ORA	A
  1530  7854  C22A7B    	JNZ	BOL;	Jump if not servicing an interrupt now.
  1531                  
  1532  7857  215E78    	LXI	H,CHB1
  1533  785A  226477    	SHLD	ISW+1;	Otherwise schedule a low-priority routine.
  1534  785D  C9        	RET
  1535                  
  1536  785E  E5        CHB1:	PUSH	H;	Beginning of low-priority routine.
  1537  785F  216677    	LXI	H,ISW0
  1538  7862  226477    	SHLD	ISW+1
  1539  7865  FB        	EI
  1540  7866  D5        	PUSH	D
  1541  7867  C5        	PUSH	B
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 14-5

  1542  7868  CD2A7B    	CALL	BOL
  1543  786B  C3DF7B    	JMP	POP4L
  1544                  
  1545                  ; (Low-priority routines need to be scheduled so that there won't be long
  1546                  ; spells of interrupt service locking out the RS232 data interrupts.)
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 15

  1547                  ; Feed motor control routines:
  1548                  
  1549  786E  F5        FMIS:	PUSH	PSW;	Feed motor interrupt service:
  1550  786F  E5        	PUSH	H
  1551  7870  D5        	PUSH	D
  1552  7871  C5        	PUSH	B
  1553  7872  CDF078    	CALL	FCYC;	Do one feed cycle.
  1554  7875  C35877    	JMP	POP4;	Restore all registers and return from the interrupt.
  1555                  
  1556                  ; The FGO subroutine begins a chain of events that will move the feed
  1557                  ; motor to position HL, including all necessary acceleration and deceleration,
  1558                  ; after which it does further actions depending on the contents of register A.
  1559                  ;	A=1: Exit.
  1560                  ;	A=2: Clear FFLAG when there is time for lens acceleration to begin,
  1561                  ;		and clamp the film when the feed has stopped.
  1562                  ;	A=3: After moving to HL, move to YB and do the actions for A=2.
  1563                  
  1564  7878  2ACE7F    FGO4:	LHLD	YB
  1565  787B  3E02      	MVI	A,2
  1566                  
  1567  787D  32547F    FGO:	STA	FTYPE
  1568                  
  1569  7880  EB        	XCHG
  1570  7881  2A4F7F    	LHLD	FMP
  1571  7884  CD927D    	CALL	CMPD
  1572                  
  1573  7887  011D7F    	LXI	B,BTLS
  1574  788A  0A        	LDAX	B
  1575  788B  D5        	PUSH	D
  1576  788C  DA9478    	JC	FGO1;	Jump if moving upwards on film (FMP to decrease).
  1577                  
  1578  788F  F640      	ORI	01000000B;   Set feed motor direction = down.
  1579  7891  C39778    	JMP	FGO2
  1580  7894  E6BF      FGO1:	ANI	10111111B;   Set feed motor direction = up.
  1581  7896  EB        	XCHG	;	Make DE ≥ HL.
  1582  7897  02        FGO2:	STAX	B
  1583  7898  D3DA      	OUT	BTLCH
  1584                  
  1585  789A  CD987D    	CALL	SUBD;	Set DE ← number of feed steps needed, say n.
  1586  789D  210200    	LXI	H,2
  1587  78A0  CD927D    	CALL	CMPD
  1588  78A3  E1        	POP	H
  1589  78A4  DA7878    	JC	FGO4;	Jump if n≤1 (this case should happen only FTYPE=3).
  1590                  
  1591  78A7  224F7F    	SHLD	FMP;	Update feed motor position.
  1592  78AA  D5        	PUSH	D
  1593                  
  1594  78AB  1B        	DCX	D
  1595  78AC  1B        	DCX	D
  1596  78AD  7B        	MOV	A,E
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 15-2

  1597  78AE  E6FC      	ANI	11111100B
  1598  78B0  5F        	MOV	E,A;	Truncate n-2 to a multiple of 4.
  1599                  
  1600  78B1  217C00    	LXI	H,31*4
  1601  78B4  CD927D    	CALL	CMPD
  1602  78B7  D2BB78    	JNC	FGO3;	Jump if (n-2)/4≥31.
  1603                  
  1604  78BA  6B        	MOV	L,E
  1605  78BB  D1        FGO3:	POP	D;	Now HL is 4 times the number of acceleration cycles (≤4*31).
  1606  78BC  CD987D    	CALL	SUBD;	Set DE ← n-HL = number of steps to take at top speed (≥2).
  1607  78BF  4D        	MOV	C,L
  1608                  
  1609  78C0  2E1C      	MVI	L,28
  1610  78C2  CD927D    	CALL	CMPD
  1611  78C5  DACE78    	JC	FGO3A;	Jump if DE < 28.
  1612                  
  1613  78C8  2E1A      	MVI	L,26;	FFLAG will be cleared 26 steps before deceleration.
  1614  78CA  CD987D    	CALL	SUBD
  1615  78CD  65        	MOV	H,L;	(Otherwise it will be cleared just before deceleration.)
  1616                  
  1617  78CE  22617F    FGO3A:	SHLD	FSTP2-1;   Set FSTP2←H.
  1618  78D1  EB        	XCHG
  1619  78D2  22607F    	SHLD	FSTP1;	   Set FSTP1←DE.
  1620                  
  1621  78D5  79        	MOV	A,C
  1622  78D6  0F        	RRC
  1623  78D7  5F        	MOV	E,A;	E ← twice the number of acceleration cycles.
  1624  78D8  210F7E    	LXI	H,TABLE
  1625  78DB  225E7F    	SHLD	FRATE;	Initialize the rate pointer.
  1626  78DE  97        	SUB	A
  1627  78DF  19        	DAD	D
  1628  78E0  67        	MOV	H,A
  1629  78E1  225C7F    	SHLD	FLIM;	Set FLIM←lsb of top-speed rate address, and set FSTAT←0.
  1630                  
  1631  78E4  32C37F    	STA	FMBSY
  1632  78E7  CDF078    	CALL	FCYC;	Do the first feed cycle.
  1633                  
  1634  78EA  3E01      	MVI	A,1
  1635  78EC  32C37F    	STA	FMBSY;	Mark feed motor busy.
  1636  78EF  C9        	RET
  1637                  
  1638                  ; FSTAT=0 when accelerating, =1 at top speed, =2 when decelerating.
  1639                  
  1640  78F0  3A5D7F    FCYC:	LDA	FSTAT;	Subroutine to do one feed motor cycle:
  1641  78F3  B7        	ORA	A
  1642  78F4  C23D79    	JNZ	FCYC1;	Jump if not accelerating.
  1643                  
  1644  78F7  2A5E7F    	LHLD	FRATE
  1645  78FA  3A5C7F    	LDA	FLIM
  1646  78FD  BD        	CMP	L
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 15-3

  1647  78FE  5E        	MOV	E,M;	Set DE to current feed motor rate.
  1648  78FF  23        	INX	H
  1649  7900  56        	MOV	D,M
  1650  7901  CA2779    	JZ	FCYC2;	Jump if at top speed.
  1651                  
  1652  7904  23        	INX	H
  1653  7905  225E7F    FCYC3:	SHLD	FRATE;	Update rate pointer.
  1654                  
  1655  7908  210100    	LXI	H,1;	Take two steps.
  1656                  
  1657  790B  3E70      FCYCS:	MVI	A,70H
  1658  790D  D3D3      	OUT	FTIMR+3;    Prepare for feed motor interrupt,
  1659  790F  7D        	MOV	A,L
  1660  7910  D3D1      	OUT	FTIMR+1
  1661  7912  7C        	MOV	A,H
  1662  7913  D3D1      	OUT	FTIMR+1;	after HL+1 steps.
  1663                  
  1664  7915  3AC37F    	LDA	FMBSY
  1665  7918  B7        	ORA	A
  1666  7919  C22079    	JNZ	FCYC4;	Jump if not the first time.
  1667                  
  1668  791C  3E34      	MVI	A,34H
  1669  791E  D3D3      	OUT	FTIMR+3;    Stop the rate counter until it is loaded.
  1670                  
  1671  7920  7B        FCYC4:	MOV	A,E
  1672  7921  D3D0      	OUT	FTIMR
  1673  7923  7A        	MOV	A,D
  1674  7924  D3D0      	OUT	FTIMR;	Load rate DE.
  1675  7926  C9        	RET	;	Return from subroutine or subsubroutine.
  1676                  
  1677  7927  21E303    FCYC2:	LXI	H,995
  1678  792A  CD927D    	CALL	CMPD
  1679  792D  D23179    	JNC	FCY2A
  1680  7930  EB        	XCHG	;	Ensure that the rate is ≥ 995.
  1681                  
  1682  7931  2A607F    FCY2A:	LHLD	FSTP1
  1683  7934  3E01      	MVI	A,1
  1684  7936  325D7F    	STA	FSTAT;	Set FSTAT = top speed.
  1685  7939  2B        FCY2B:	DCX	H;	HL = number of steps - 1.
  1686  793A  C30B79    	JMP	FCYCS
  1687                  
  1688  793D  0F        FCYC1:	RRC
  1689  793E  D26479    	JNC	FCYC6;	Jump if decelerating.
  1690                  
  1691  7941  3E02      	MVI	A,2
  1692  7943  325D7F    	STA	FSTAT;	Set FSTAT = decelerating.
  1693                  
  1694  7946  21547F    	LXI	H,FTYPE
  1695  7949  BE        	CMP	M
  1696  794A  C25479    	JNZ	FCY1A;	Jump if FTYPE≠2.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 15-4

  1697                  
  1698  794D  97        	SUB	A
  1699  794E  321E7F    	STA	FFLAG;	Clear FFLAG.
  1700                  
  1701  7951  CD3D78    	CALL	CHBOL;	Check if line can begin.
  1702                  
  1703  7954  3A627F    FCY1A:	LDA	FSTP2
  1704  7957  B7        	ORA	A
  1705  7958  CA6479    	JZ	FCYC6;	Jump if no more steps to take at top speed.
  1706                  
  1707  795B  6F        	MOV	L,A
  1708  795C  2600      	MVI	H,0
  1709  795E  11E303    	LXI	D,995;	(If FSTP2≠0, top speed is 995.)
  1710  7961  C33979    	JMP	FCY2B;	Otherwise take them.
  1711                  
  1712  7964  3E0F      FCYC6:	MVI	A,TABLE AND 0FFH
  1713  7966  2A5E7F    	LHLD	FRATE
  1714  7969  BD        	CMP	L
  1715  796A  CA7479    	JZ	FCYC7;	Jump if done decelerating.
  1716                  
  1717  796D  2B        	DCX	H
  1718  796E  56        	MOV	D,M
  1719  796F  2B        	DCX	H;	Set DE to previous rate.
  1720  7970  5E        	MOV	E,M
  1721  7971  C30579    	JMP	FCYC3;	Do the next deceleration cycle.
  1722                  
  1723  7974  3E34      FCYC7:	MVI	A,34H
  1724  7976  D3D3      	OUT	FTIMR+3;   Stop the motor.
  1725  7978  3E70      	MVI	A,70H
  1726  797A  D3D3      	OUT	FTIMR+3
  1727                  
  1728  797C  3A547F    FCYC8:	LDA	FTYPE
  1729  797F  3D        	DCR	A
  1730  7980  32C37F    	STA	FMBSY
  1731  7983  C8        	RZ	;	Return with FMBSY=0 if FTYPE=1.
  1732                  
  1733  7984  FE02      	CPI	2
  1734  7986  C29879    	JNZ	FCYC9;	Jump if FTYPE=2.
  1735                  
  1736  7989  321E7F    	STA	FFLAG;	Otherwise begin a low-level routine
  1737  798C  E1        	POP	H;	  that calls FGO again with FTYPE=2, moving to YB.
  1738  798D  2ACE7F    	LHLD	YB
  1739  7990  224D7F    	SHLD	YWANT
  1740  7993  C1        	POP	B
  1741  7994  D1        	POP	D
  1742  7995  C3E479    	JMP	GPTI2
  1743                  
  1744  7998  211C7F    FCYC9:	LXI	H,MSLS
  1745  799B  7E        	MOV	A,M
  1746  799C  F604      	ORI	00000100B
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 15-5

  1747  799E  77        	MOV	M,A
  1748  799F  D3DB      	OUT	MSLCH;	Clamp the film.
  1749                  
  1750  79A1  97        	SUB	A
  1751  79A2  32557F    	STA	GTYPE
  1752  79A5  C3BD79    	JMP	NCL1;	Set up timer interrupt and return.
  1753                  
  1754                  ; The following subroutine is used to unclamp the film and start the feed motor.
  1755                  ; On entry, HL is the desired feed motor position, and A gives the type of
  1756                  ; feed action desired (as in FGO).
  1757  79A8  32557F    NCLMP:	STA	GTYPE;	Set GTYPE to the future FTYPE code.
  1758  79AB  32C37F    	STA	FMBSY;	Mark feed motor busy.
  1759  79AE  321E7F    	STA	FFLAG;	Set FFLAG≠0.
  1760  79B1  224D7F    	SHLD	YWANT;	Store desired feed position.
  1761                  
  1762  79B4  211C7F    	LXI	H,MSLS
  1763  79B7  7E        	MOV	A,M
  1764  79B8  E6FB      	ANI	11111011B
  1765  79BA  77        	MOV	M,A
  1766  79BB  D3DB      	OUT	MSLCH;	Unclamp the film.
  1767                  
  1768  79BD  D3CA      NCL1:	OUT	GTIMR
  1769  79BF  3EEA      	MVI	A,234
  1770  79C1  D3CA      	OUT	GTIMR;	Set up timer interrupt after about 30 milliseconds.
  1771  79C3  C9        	RET
  1772                  
  1773                  ; GTYPE=0 means return after clamping; GTYPE=1,2,3 means feed after unclamping;
  1774                  ; GTYPE=4 means output GO should be enabled.
  1775  79C4  F5        GPTIS:	PUSH	PSW;	General-purpose timer interrupt service:
  1776  79C5  E5        	PUSH	H
  1777                  
  1778  79C6  3A557F    	LDA	GTYPE
  1779  79C9  B7        	ORA	A
  1780  79CA  CADE79    	JZ	GPTI1;	Jump if GTYPE=0.
  1781                  
  1782  79CD  FE04      	CPI	4
  1783  79CF  C2E479    	JNZ	GPTI2;	Jump if GTYPE=1,2,3.
  1784                  
  1785  79D2  211D7F    	LXI	H,BTLS
  1786  79D5  7E        	MOV	A,M
  1787  79D6  F608      	ORI	00001000B
  1788  79D8  77        	MOV	M,A
  1789  79D9  D3DA      	OUT	BTLCH;	Enable output GO.
  1790  79DB  C35A77    	JMP	POP2;	Restore H and PSW, then return from interrupt.
  1791                  
  1792  79DE  32C37F    GPTI1:	STA	FMBSY;	Mark feed motor nonbusy.
  1793  79E1  C35A77    	JMP	POP2;	Restore H and PSW, then return from interrupt.
  1794                  
  1795  79E4  21ED79    GPTI2:	LXI	H,GPTI3;  (Note that we can get here from FCYC8.)
  1796  79E7  226477    	SHLD	ISW+1;	Schedule a low-priority routine.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 15-6

  1797  79EA  C35A77    	JMP	POP2
  1798                  
  1799  79ED  E5        GPTI3:	PUSH	H;	Beginning of low-priority routine.
  1800  79EE  216677    	LXI	H,ISW0
  1801  79F1  226477    	SHLD	ISW+1
  1802  79F4  FB        	EI
  1803  79F5  D5        	PUSH	D
  1804  79F6  C5        	PUSH	B
  1805                  
  1806  79F7  CDEF7D    	CALL	DELAY2;	Wait about 2 milliseconds.
  1807  79FA  2A4D7F    	LHLD	YWANT
  1808  79FD  3A1E7F    	LDA	FFLAG
  1809  7A00  CD7D78    	CALL	FGO;	Unclamping is done, start the feed motor.
  1810  7A03  C3DF7B    	JMP	POP4L;	Restore all registers and return from interrupt.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 16

  1811                  ; Programs for beginning and ending the typesetting of a line or page.
  1812                  
  1813  7A06  CD0074    BPAGE:	CALL	GET;	Begin-page command:
  1814  7A09  5F        	MOV	E,A
  1815  7A0A  CD0074    	CALL	GET
  1816  7A0D  57        	MOV	D,A;	DE←starting left cog.
  1817                  
  1818  7A0E  3A0D7F    BP1:	LDA	READY
  1819  7A11  21C37F    	LXI	H,FMBSY
  1820  7A14  B6        	ORA	M
  1821  7A15  21C27F    	LXI	H,LMBSY
  1822  7A18  B6        	ORA	M
  1823  7A19  C20E7A    	JNZ	BP1;	Wait until READY=FMBSY=LMBSY=0.
  1824                  
  1825  7A1C  211C7F    BP2:	LXI	H,MSLS
  1826  7A1F  7E        	MOV	A,M
  1827  7A20  B7        	ORA	A
  1828  7A21  F23A7A    	JP	BP3;	Jump if not waiting for film loading.
  1829  7A24  3A157F    	LDA	QFLAG
  1830  7A27  FE0F      	CPI	1111B
  1831  7A29  CA3A7A    	JZ	BP3;	Go on if ABORT is pending.
  1832                  
  1833  7A2C  3A0C7F    	LDA	KBIB1
  1834  7A2F  FE03      	CPI	3
  1835  7A31  C21C7A    	JNZ	BP2;	Wait until `5' is pushed on operator keypad.
  1836                  
  1837  7A34  7E        	MOV	A,M
  1838  7A35  E67F      	ANI	01111111B
  1839  7A37  77        	MOV	M,A
  1840  7A38  D3DB      	OUT	MSLCH;	Turn audio signal off.
  1841                  	
  1842  7A3A  3EAA      BP3:	MVI	A,10101010B
  1843  7A3C  32E27F    	STA	STATE
  1844  7A3F  32E37F    	STA	OUTST;	Initialize line-setting states to LR.
  1845                  
  1846  7A42  CDDF7A    	CALL	LREST;	Compute lens motor rest position and associated corrections.
  1847                  
  1848  7A45  CD0074    	CALL	GET
  1849  7A48  5F        	MOV	E,A
  1850  7A49  CD0074    	CALL	GET
  1851  7A4C  57        	MOV	D,A;	DE←desired baseline.
  1852  7A4D  D5        	PUSH	D
  1853                  
  1854  7A4E  210A00    	LXI	H,10
  1855  7A51  19        	DAD	D
  1856  7A52  22257F    	SHLD	YBASE;	(Actual baselines are 10 more than the host thinks.)
  1857  7A55  22CE7F    	SHLD	YB
  1858                  
  1859  7A58  2A417F    	LHLD	LRCOR
  1860  7A5B  22337F    	SHLD	CORR
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 16-2

  1861  7A5E  2A457F    	LHLD	LRHSC
  1862  7A61  22357F    	SHLD	HCOG;	Move line-begin parameters to proper place.
  1863                  
  1864  7A64  E1        	POP	H;	HL←new baseline (less 10).
  1865  7A65  3E03      	MVI	A,3
  1866  7A67  CDA879    	CALL	NCLMP;	Unclamp, move to HL, move to YB, clamp.
  1867                  
  1868  7A6A  2A477F    	LHLD	LRRST
  1869  7A6D  EB        	XCHG
  1870  7A6E  CD6977    	CALL	LGO0;	Simultaneously, move lens motor to initial position.
  1871                  
  1872  7A71  2A207F    	LHLD	LB0
  1873  7A74  22277F    	SHLD	LBIN
  1874  7A77  22297F    	SHLD	LBOUT;	Empty the line buffer.
  1875  7A7A  C3BA74    	JMP	READ;	Go to next command.
  1876                  
  1877  7A7D  CD0074    EOL:	CALL	GET;	End-of-line command:
  1878  7A80  5F        	MOV	E,A
  1879  7A81  CD0074    	CALL	GET
  1880  7A84  57        	MOV	D,A;	DE←ending cog.
  1881  7A85  CDA07D    	CALL	NEGD
  1882  7A88  E5        	PUSH	H;	Save -DE.
  1883                  
  1884  7A89  21E27F    	LXI	H,STATE
  1885  7A8C  7E        	MOV	A,M
  1886  7A8D  0F        	RRC
  1887  7A8E  77        	MOV	M,A;	Complement the state.
  1888                  
  1889  7A8F  F5        	PUSH	PSW
  1890  7A90  CDDF7A    	CALL	LREST;	Compute line end parameters.
  1891  7A93  F1        	POP	PSW
  1892                  
  1893  7A94  2A257F    	LHLD	YBASE
  1894  7A97  EB        	XCHG
  1895  7A98  2A277F    	LHLD	LBIN
  1896  7A9B  DAB27A    	JC	EOL1;	Jump if the state was RL.
  1897                  
  1898  7A9E  22497F    	SHLD	LRSTP;	Store LR stopping position.
  1899  7AA1  EB        	XCHG
  1900  7AA2  22397F    	SHLD	RLYB;	Store new baseline for next line.
  1901                  
  1902  7AA5  E1        	POP	H
  1903  7AA6  222B7F    	SHLD	RLI;	Initialize cog accumulators to -(right cog).
  1904  7AA9  222D7F    	SHLD	RLJ
  1905                  	
  1906  7AAC  21FBBF    	LXI	H,LBEND-5;  Next line will appear at top end of line buffer.
  1907  7AAF  C3D17A    	JMP	EOL2
  1908                  
  1909  7AB2  223F7F    EOL1:	SHLD	RLSTP;	Store RL starting position.
  1910  7AB5  EB        	XCHG
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 16-3

  1911  7AB6  22437F    	SHLD	LRYB;	Store new baseline for next line.
  1912                  
  1913  7AB9  C1        	POP	B
  1914  7ABA  2A2B7F    	LHLD	RLI
  1915  7ABD  CD9F7D    	CALL	XNEGD
  1916  7AC0  09        	DAD	B
  1917  7AC1  22D67F    	SHLD	COGID;	First COGI correction is -(left cog)-RLI.
  1918  7AC4  2A2D7F    	LHLD	RLJ
  1919  7AC7  CD9F7D    	CALL	XNEGD
  1920  7ACA  09        	DAD	B
  1921  7ACB  22D87F    	SHLD	COGJD;	First COGJ correction is -(left cog)-RLJ.
  1922                  
  1923  7ACE  2A207F    	LHLD	LB0;	Next line will appear at bottom end of line buffer.
  1924                  
  1925  7AD1  22277F    EOL2:	SHLD	LBIN
  1926                  
  1927  7AD4  210D7F    	LXI	H,READY
  1928  7AD7  34        	INR	M;	Increase READY by 1.
  1929  7AD8  7C        	MOV	A,H;	Make rA≠0.
  1930  7AD9  CD3D78    	CALL	CHBOL;	Check if new line can start now.
  1931                  
  1932  7ADC  C3BA74    	JMP	READ;	Proceed to the next command.
  1933                  
  1934                  ; Subroutine to calculate lens resting positions, where DE is the cog position.
  1935  7ADF  D5        LREST:	PUSH	D;	Save cog value c.
  1936  7AE0  218407    	LXI	H,1924
  1937  7AE3  CD987D    	CALL	SUBD;	DE←c-1924.
  1938  7AE6  EB        	XCHG
  1939  7AE7  29        	DAD	H
  1940  7AE8  29        	DAD	H
  1941  7AE9  29        	DAD	H
  1942  7AEA  29        	DAD	H;	HL←(c-1924)*16.
  1943                  
  1944  7AEB  11038D    	LXI	D,8D03H;   DE←correction factor (which is .55082703).
  1945                  ; This correction factor converts cogs/16 to motor steps.
  1946                  ; It equals (65536 x 3ms)/(16 x 610 x 558.03ns).
  1947                  
  1948  7AEE  CDA87D    	CALL	MULTD;	Now HL = rest position, DE = fractional undershoot.
  1949  7AF1  E5        	PUSH	H
  1950                  
  1951  7AF2  21A902    	LXI	H,681
  1952  7AF5  CDA87D    	CALL	MULTD;	Now HL = undershoot, in units of timer clock cycles.
  1953                  ; 610 cycles on the motor clock is about 681 on the timer clock.
  1954                  
  1955  7AF8  3AE27F    	LDA	STATE
  1956  7AFB  B7        	ORA	A
  1957  7AFC  FA157B    	JM	LR1;	Jump if LR state.
  1958                  
  1959  7AFF  117003    	LXI	D,681+200-1;	Make the correction at least 200.
  1960  7B02  CD987D    	CALL	SUBD
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 16-4

  1961  7B05  EB        	XCHG
  1962  7B06  22377F    	SHLD	RLCOR;	RL correction in clock cycles.
  1963  7B09  E1        	POP	H
  1964  7B0A  223D7F    	SHLD	RLRST;	RL motor rest position.
  1965  7B0D  E1        	POP	H
  1966  7B0E  23        	INX	H
  1967  7B0F  23        	INX	H
  1968  7B10  29        	DAD	H
  1969  7B11  223B7F    	SHLD	RLHSC;	RL hardware starting cog is 2(c+2).
  1970  7B14  C9        	RET
  1971                  
  1972  7B15  11C800    LR1:	LXI	D,200;	Make the correction at least 200.
  1973  7B18  19        	DAD	D
  1974  7B19  22417F    	SHLD	LRCOR;	LR correction in clock cycles.
  1975  7B1C  E1        	POP	H
  1976  7B1D  22477F    	SHLD	LRRST;	LR motor rest position.
  1977  7B20  E1        	POP	H
  1978  7B21  11FEFF    	LXI	D,-2
  1979  7B24  19        	DAD	D
  1980  7B25  29        	DAD	H
  1981  7B26  22457F    	SHLD	LRHSC;	LR hardware starting cog is 2(c-2).
  1982  7B29  C9        	RET
  1983                  
  1984                  ; The following subroutine is called when it's time to begin typesetting a line.
  1985  7B2A  97        BOL:	SUB	A
  1986  7B2B  D3DF      	OUT	RPLCH
  1987                  
  1988  7B2D  21357F    	LXI	H,HCOG
  1989  7B30  3E80      	MVI	A,10000000B
  1990  7B32  B6        	ORA	M
  1991  7B33  D3DF      	OUT	RPLCH;	Set up hardware cog counter.
  1992                  
  1993  7B35  3AE37F    	LDA	OUTST
  1994  7B38  0F        	RRC
  1995  7B39  D24F7B    	JNC	BOL1;	Jump if output line to be left-to-right.
  1996                  
  1997  7B3C  2A477F    	LHLD	LRRST
  1998  7B3F  E5        	PUSH	H;	Save rest position at end of line.
  1999                  
  2000  7B40  2A3F7F    	LHLD	RLSTP
  2001  7B43  110500    	LXI	D,5
  2002  7B46  19        	DAD	D;	HL←starting position in line buffer.
  2003  7B47  1100C0    	LXI	D,LBEND;   DE←stopping position in line buffer.
  2004  7B4A  3EBD      	MVI	A,10111101B;	A←right-to-left code.
  2005  7B4C  C35C7B    	JMP	BOL2
  2006                  
  2007  7B4F  2A3D7F    BOL1:	LHLD	RLRST
  2008  7B52  E5        	PUSH	H;	Save rest position at end of line.
  2009                  
  2010  7B53  2A497F    	LHLD	LRSTP
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 16-5

  2011  7B56  EB        	XCHG	;	DE←stopping position in line buffer.
  2012  7B57  2A207F    	LHLD	LB0;	HL←starting position in line buffer.
  2013  7B5A  3E9D      	MVI	A,10011101B;	A←left-to-right code.
  2014                  
  2015  7B5C  D3DF      BOL2:	OUT	RPLCH;	Set the hardware repeat latch.
  2016  7B5E  22DA7F    	SHLD	INSTB;	Store the starting position.
  2017  7B61  22DE7F    	SHLD	INSTI;	Initialize for reading the line buffer.
  2018  7B64  22E07F    	SHLD	INSTJ
  2019                  
  2020  7B67  EB        	XCHG
  2021  7B68  22DC7F    	SHLD	INSTE;	Store the stopping position.
  2022                  
  2023  7B6B  97        	SUB	A
  2024  7B6C  322F7F    	STA	CHARI
  2025  7B6F  32317F    	STA	CHARJ;	CHARI,CHARJ ← address of CHAR1 buffer.
  2026                  
  2027  7B72  D1        	POP	D
  2028  7B73  CD6B77    	CALL	LGO;	Start lens motor (which will enable GO in due time).
  2029                  
  2030  7B76  210000    	LXI	H,0
  2031  7B79  E5        	PUSH	H;	Get ready to jump into the SETUP routine,
  2032  7B7A  2C        	INR	L;	  with COG=0, COGI=1, COGJ=2.
  2033  7B7B  22D27F    	SHLD	COGI
  2034  7B7E  2C        	INR	L
  2035  7B7F  22D47F    	SHLD	COGJ
  2036  7B82  3E80      	MVI	A,10000000B
  2037                  ;	sta	schk;	(this instruction is for debugging)
  2038  7B84  210181    	LXI	H,CHAR1+1
  2039  7B87  C3037C    	JMP	SET1A;	Prepare for first scan-done interrupt.
  2040                  ; schk:	db	0;	(this byte is for debugging)
  2041                  
  2042                  ; The effect of this somewhat tricky initialization is to set
  2043                  ;	COG ← 1,
  2044                  ;	COGI ← 2 + distance from line-begin cog to starting cog of first character.
  2045                  ;	COGJ ← 2 + distance from line-begin cog to stopping cog of first character.
  2046                  ;	INSTI, INSTJ ← line buffer address following the first character.
  2047                  ;	CHAR1, CHAR2 ← blank characters.
  2048                  ; and the first scan-done interrupt will transmit blanks to the decoder boards.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17

  2049                  ; Processing of scan-done interrupts:
  2050  7B8A  F5        SDIS:	PUSH	PSW
  2051  7B8B  E5        	PUSH	H
  2052                  
  2053                  ;	lda	schk;	Debugging code to check if we blew it.
  2054                  ;	ora	a
  2055                  ;	jz	sch1
  2056                  ;	mvi	a,'!'
  2057                  ;	call	dc;	This instruction can be replaced by `JMP QUIT'.
  2058                  ; sch1:	mvi	a,1
  2059                  ;	sta	schk
  2060                  
  2061  7B8C  2A237F    	LHLD	LNGTH
  2062  7B8F  7C        	MOV	A,H
  2063  7B90  B7        	ORA	A
  2064  7B91  FAC77B    	JM	SDIS1;	Jump if no DMA needed.
  2065  7B94  7D        	MOV	A,L
  2066  7B95  D3D2      	OUT	DMA
  2067  7B97  7C        	MOV	A,H
  2068  7B98  D3D2      	OUT	DMA;	Send DMA count for character 1.
  2069  7B9A  2A0781    	LHLD	C1DI
  2070  7B9D  7D        	MOV	A,L
  2071  7B9E  D3D8      	OUT	DMA+6
  2072  7BA0  7C        	MOV	A,H
  2073  7BA1  D3D9      	OUT	DMA+7;	Send DMA address for character 1.
  2074  7BA3  D3DC      	OUT	DMA+10;	DMA character 1 (CPU stops till done).
  2075                  
  2076  7BA5  3A0A81    	LDA	C2NB7
  2077  7BA8  2A0B81    	LHLD	C2B7A;	HL←byte 7 address for character 2.
  2078  7BAB  77        	MOV	M,A;	Store new byte 7. (Note that character 1 might
  2079  7BAC  23        	INX	H;	   equal character 2, hence these variable bytes
  2080  7BAD  23        	INX	H;	   aren't stored until after the DMA of character 1.)
  2081  7BAE  23        	INX	H
  2082  7BAF  3A0D81    	LDA	C2NBA
  2083  7BB2  77        	MOV	M,A;	Store new byte 10.
  2084                  
  2085  7BB3  2A0E81    	LHLD	C2DC
  2086  7BB6  7D        	MOV	A,L
  2087  7BB7  D3D2      	OUT	DMA;	Send lsb of DMA count.
  2088  7BB9  7C        	MOV	A,H
  2089  7BBA  D3D2      	OUT	DMA;	Send msb of DMA count.
  2090                  
  2091  7BBC  2A1081    	LHLD	C2DI
  2092  7BBF  7D        	MOV	A,L
  2093  7BC0  D3D8      	OUT	DMA+6;	Send lsb of DMA info.
  2094  7BC2  7C        	MOV	A,H
  2095  7BC3  D3D9      	OUT	DMA+7;	Send msb of DMA info.
  2096                  
  2097  7BC5  D3DC      	OUT	DMA+10;	DMA character 2 (CPU stops till done).
  2098                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17-2

  2099  7BC7  DBDE      SDIS1:	IN	COLL;	Start next collection.
  2100                  ; Whew. That was the critical path, whose aim was to start collecting as
  2101                  ; soon as possible. Now we have more time to breathe.
  2102                  
  2103  7BC9  21D27B    	LXI	H,SDIS2;  Schedule a low-priority routine.
  2104  7BCC  226477    	SHLD	ISW+1
  2105  7BCF  C35A77    	JMP	POP2
  2106                  
  2107  7BD2  E5        SDIS2:	PUSH	H;	Beginning of low-priority routine.
  2108  7BD3  216677    	LXI	H,ISW0
  2109  7BD6  226477    	SHLD	ISW+1
  2110  7BD9  FB        	EI
  2111  7BDA  D5        	PUSH	D
  2112  7BDB  C5        	PUSH	B
  2113  7BDC  CDE47B    	CALL	SETUP;	Get ready for the next scan-done interrupt.
  2114                  
  2115  7BDF  C1        POP4L:	POP	B;	Return from specially-scheduled low-priority routine.
  2116  7BE0  D1        POP3L:	POP	D
  2117  7BE1  E1        POP2L:	POP	H
  2118  7BE2  F1        POP1L:	POP	PSW
  2119  7BE3  C9        	RET
  2120                  
  2121                  ; The following subroutine prepares for the next scan-done interrupt.
  2122  7BE4  3E80      SETUP:	MVI	A,10000000B
  2123  7BE6  32227F    	STA	SFLAG;	SFLAG negative means that no DMA is needed.
  2124                  	
  2125  7BE9  2AD07F    	LHLD	COG
  2126  7BEC  EB        	XCHG	;	DE←current software cog.
  2127                  
  2128  7BED  2AD47F    SET1:	LHLD	COGJ
  2129  7BF0  CD927D    	CALL	CMPD
  2130  7BF3  C2507C    	JNZ	SET2;	Jump if no character is due to exit.
  2131                  
  2132  7BF6  97        	SUB	A
  2133  7BF7  32227F    	STA	SFLAG;	Specify that DMA is needed.
  2134                  
  2135  7BFA  D5        	PUSH	D
  2136  7BFB  2A317F    	LHLD	CHARJ
  2137  7BFE  7E        	MOV	A,M
  2138  7BFF  32317F    	STA	CHARJ;	Swap character buffers.
  2139                  
  2140  7C02  23        	INX	H
  2141  7C03  CDD57D    SET1A:	CALL	MOVBL;	Blank out the previous character.
  2142                  
  2143  7C06  2ADC7F    SET1B:	LHLD	INSTE;	Advance J to the next character to exit:
  2144  7C09  EB        	XCHG
  2145  7C0A  2AE07F    	LHLD	INSTJ
  2146  7C0D  CD927D    	CALL	CMPD
  2147  7C10  CA2D7C    	JZ	SET1C;	Jump if at end of line buffer.
  2148                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17-3

  2149  7C13  7E        	MOV	A,M;	A←first byte of line buffer entry.
  2150  7C14  23        	INX	H
  2151  7C15  23        	INX	H
  2152  7C16  23        	INX	H
  2153  7C17  4E        	MOV	C,M;	C←fourth byte.
  2154  7C18  23        	INX	H
  2155  7C19  5E        	MOV	E,M;	E←fifth byte.
  2156                  
  2157  7C1A  23        	INX	H
  2158  7C1B  22E07F    	SHLD	INSTJ;	Advance line buffer pointer.
  2159                  
  2160  7C1E  2AD47F    	LHLD	COGJ
  2161  7C21  B7        	ORA	A
  2162  7C22  C2337C    	JNZ	SET1D;	Jump if line buffer entry was a Typeset command.
  2163                  
  2164  7C25  43        	MOV	B,E;	BC←cog adjustment.
  2165  7C26  09        	DAD	B
  2166  7C27  22D47F    	SHLD	COGJ;	Update ending cog.
  2167  7C2A  C3067C    	JMP	SET1B;	Return to advance some more.
  2168                  
  2169  7C2D  21FFFF    SET1C:	LXI	H,0FFFFH;	HL←infinity.
  2170  7C30  C3497C    	JMP	SET1F;	(Now COGJ will have an impossible value.)
  2171                  
  2172  7C33  1600      SET1D:	MVI	D,0
  2173  7C35  3AE37F    	LDA	OUTST
  2174  7C38  B7        	ORA	A
  2175  7C39  FA487C    	JM	SET1E;	Jump if setting LR.
  2176                  
  2177  7C3C  D5        	PUSH	D
  2178  7C3D  EB        	XCHG
  2179  7C3E  2AD87F    	LHLD	COGJD
  2180  7C41  19        	DAD	D
  2181  7C42  EB        	XCHG
  2182  7C43  E1        	POP	H;	If going RL, we assign COGJ←COGJ+COGJD, COGJD←DE.
  2183  7C44  22D87F    	SHLD	COGJD
  2184                  
  2185  7C47  6C        	MOV	L,H;	HL←0.
  2186  7C48  19        SET1E:	DAD	D;	If going LR, we simply assign COGJ←COGJ+DE.
  2187                  
  2188  7C49  22D47F    SET1F:	SHLD	COGJ;	Update ending cog.
  2189  7C4C  D1        	POP	D
  2190  7C4D  C3ED7B    	JMP	SET1;	Check if the next character wants to exit, too.
  2191                  
  2192  7C50  13        SET2:	INX	D;	Increase software cog counter.
  2193  7C51  EB        	XCHG
  2194  7C52  22D07F    	SHLD	COG
  2195  7C55  EB        	XCHG
  2196                  
  2197  7C56  210300    	LXI	H,3
  2198  7C59  CD927D    	CALL	CMPD
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17-4

  2199  7C5C  C2687C    	JNZ	SET3;	Jump if not time to turn video on.
  2200                  
  2201  7C5F  211C7F    	LXI	H,MSLS
  2202  7C62  7E        	MOV	A,M
  2203  7C63  F608      	ORI	00001000B
  2204  7C65  77        	MOV	M,A
  2205  7C66  D3DB      	OUT	MSLCH;	Video on (blanks are being transmitted).
  2206                  
  2207  7C68  2AD27F    SET3:	LHLD	COGI
  2208  7C6B  CD927D    	CALL	CMPD
  2209  7C6E  C2197D    	JNZ	SET4;	Jump if no character is due to enter.
  2210                  
  2211  7C71  97        	SUB	A
  2212  7C72  32227F    	STA	SFLAG;	Specify that DMA is needed.
  2213                  
  2214  7C75  D5        	PUSH	D;	Save COG.
  2215  7C76  2ADA7F    	LHLD	INSTB
  2216  7C79  EB        	XCHG
  2217  7C7A  2ADE7F    	LHLD	INSTI
  2218  7C7D  CD927D    	CALL	CMPD
  2219  7C80  CAC57C    	JZ	SET3A;	Jump if INSTI=INSTB.
  2220                  
  2221  7C83  11FBFF    	LXI	D,-5
  2222  7C86  19        	DAD	D;	Go back to look at previous line buffer entry.
  2223  7C87  22C67F    	SHLD	TEMP
  2224                  
  2225  7C8A  6E        	MOV	L,M;	L←entering character reference code.
  2226  7C8B  2600      	MVI	H,0
  2227  7C8D  29        	DAD	H
  2228  7C8E  29        	DAD	H
  2229  7C8F  110E81    	LXI	D,CTB-12
  2230  7C92  19        	DAD	D;	HL←CTB table location for character.
  2231                  
  2232  7C93  4E        	MOV	C,M
  2233  7C94  23        	INX	H
  2234  7C95  46        	MOV	B,M;	BC←number of boundary data bytes.
  2235                  
  2236  7C96  23        	INX	H
  2237  7C97  5E        	MOV	E,M
  2238  7C98  23        	INX	H
  2239  7C99  56        	MOV	D,M;	DE←repertoire location.
  2240                  
  2241  7C9A  D5        	PUSH	D
  2242  7C9B  210600    	LXI	H,6
  2243  7C9E  19        	DAD	D
  2244  7C9F  E5        	PUSH	H;	Save location of byte 7.
  2245                  
  2246  7CA0  2AC67F    	LHLD	TEMP
  2247  7CA3  EB        	XCHG	;	DE←location in line buffer.
  2248                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17-5

  2249  7CA4  2A2F7F    	LHLD	CHARI
  2250  7CA7  7E        	MOV	A,M
  2251  7CA8  322F7F    	STA	CHARI;	Swap character buffers.
  2252  7CAB  23        	INX	H;	HL←location to store character info.
  2253                  
  2254  7CAC  13        	INX	D
  2255  7CAD  1A        	LDAX	D;	A←new byte 7 for character.
  2256  7CAE  77        	MOV	M,A;	Store new byte 7.
  2257                  
  2258  7CAF  13        	INX	D
  2259  7CB0  1A        	LDAX	D;	A←new byte 10 for character.
  2260                  
  2261  7CB1  D1        	POP	D
  2262  7CB2  23        	INX	H
  2263  7CB3  73        	MOV	M,E
  2264  7CB4  23        	INX	H
  2265  7CB5  72        	MOV	M,D;	Store address of byte 7.
  2266                  
  2267  7CB6  23        	INX	H
  2268  7CB7  77        	MOV	M,A;	Store new byte 10.
  2269                  	
  2270  7CB8  23        	INX	H
  2271  7CB9  03        	INX	B
  2272  7CBA  71        	MOV	M,C
  2273  7CBB  23        	INX	H
  2274  7CBC  70        	MOV	M,B;	Store DMA count.
  2275                  
  2276  7CBD  D1        	POP	D
  2277  7CBE  23        	INX	H
  2278  7CBF  73        	MOV	M,E
  2279  7CC0  23        	INX	H
  2280  7CC1  72        	MOV	M,D;	Store address of byte 1.
  2281  7CC2  C3CF7C    	JMP	SET3B
  2282                  
  2283  7CC5  210A81    SET3A:	LXI	H,CHAR2+1;   (We get here when initializing.)
  2284  7CC8  CDD57D    	CALL	MOVBL;	Blank out character 2.
  2285  7CCB  21D27F    	LXI	H,COGI
  2286  7CCE  34        	INR	M;	Change COGI to 2.
  2287                  
  2288  7CCF  2ADC7F    SET3B:	LHLD	INSTE;	Advance I to next entering character:
  2289  7CD2  EB        	XCHG
  2290  7CD3  2ADE7F    	LHLD	INSTI
  2291  7CD6  CD927D    	CALL	CMPD
  2292  7CD9  CAF67C    	JZ	SET3C;	Jump if at end of line buffer.
  2293                  
  2294  7CDC  7E        	MOV	A,M;	A←first byte of line buffer command.
  2295  7CDD  23        	INX	H
  2296  7CDE  23        	INX	H
  2297  7CDF  23        	INX	H
  2298  7CE0  5E        	MOV	E,M;	E←fourth byte.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17-6

  2299  7CE1  23        	INX	H
  2300  7CE2  4E        	MOV	C,M;	C←fifth byte.
  2301                  
  2302  7CE3  23        	INX	H
  2303  7CE4  22DE7F    	SHLD	INSTI;	Advance pointer.
  2304                  
  2305  7CE7  2AD27F    	LHLD	COGI
  2306  7CEA  B7        	ORA	A
  2307  7CEB  C2FC7C    	JNZ	SET3D;	Jump if current entry is a Typeset command.
  2308                  
  2309  7CEE  51        	MOV	D,C;	DE←cog adjustment.
  2310  7CEF  19        	DAD	D
  2311  7CF0  22D27F    	SHLD	COGI;	Update beginning cog.
  2312  7CF3  C3CF7C    	JMP	SET3B;	Return to advance again.
  2313                  
  2314  7CF6  21FFFF    SET3C:	LXI	H,0FFFFH;	HL←infinity.
  2315  7CF9  C3127D    	JMP	SET3F;	(Now COGI will be set to an impossible value.)
  2316                  
  2317  7CFC  1600      SET3D:	MVI	D,0
  2318  7CFE  3AE37F    	LDA	OUTST
  2319  7D01  B7        	ORA	A
  2320  7D02  FA117D    	JM	SET3E;	Jump if setting LR.
  2321                  
  2322  7D05  D5        	PUSH	D
  2323  7D06  EB        	XCHG
  2324  7D07  2AD67F    	LHLD	COGID
  2325  7D0A  19        	DAD	D
  2326  7D0B  EB        	XCHG
  2327  7D0C  E1        	POP	H;	If going RL, we assign COGI←COGI+COGID, COGID←DE.
  2328  7D0D  22D67F    	SHLD	COGID
  2329                  
  2330  7D10  6C        	MOV	L,H;	HL←0.
  2331  7D11  19        SET3E:	DAD	D;	If going LR, we simply assign COGI←COGI+DE.
  2332                  	
  2333  7D12  22D27F    SET3F:	SHLD	COGI;	Update beginning cog.
  2334                  
  2335  7D15  D1        	POP	D;	DE←COG.
  2336  7D16  C3687C    	JMP	SET3;	Check if another character wants to enter.
  2337                  
  2338  7D19  3A227F    SET4:	LDA	SFLAG
  2339  7D1C  B7        	ORA	A
  2340  7D1D  FA397D    	JM	SET6;	Jump if SFLAG is negative (no DMA to set up).
  2341                  
  2342  7D20  3A0181    	LDA	C1NB7;	Get ready to DMA character 1.
  2343  7D23  2A0281    	LHLD	C1B7A
  2344  7D26  77        	MOV	M,A;	Store new byte 7.
  2345  7D27  23        	INX	H
  2346  7D28  23        	INX	H
  2347  7D29  23        	INX	H
  2348  7D2A  3A0481    	LDA	C1NBA
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17-7

  2349  7D2D  77        	MOV	M,A;	Store new byte 10.
  2350                  
  2351  7D2E  2A0581    	LHLD	C1DC
  2352  7D31  11FDFF    	LXI	D,-3
  2353  7D34  19        	DAD	D
  2354  7D35  22237F    	SHLD	LNGTH;	Set LNGTH to DMA count for character 1 (which is positive).
  2355                  
  2356                  ; set5:	sub	a
  2357                  ;	sta	schk;	Temporary code to check if we made it before interrupt.
  2358  7D38  C9        	RET
  2359                  
  2360  7D39  32247F    SET6:	STA	LNGTH+1;	Set LNGTH negative.
  2361  7D3C  3A577F    	LDA	LSTAT
  2362  7D3F  FE02      	CPI	2
  2363                  ;	jc	set5;	(temporary code for debugging, replaces the following `RC')
  2364  7D41  D8        	RC	;	Return if current line not finished.
  2365                  
  2366  7D42  211D7F    	LXI	H,BTLS;	We have just finished typesetting a line (LTYPE=0).
  2367  7D45  7E        	MOV	A,M
  2368  7D46  E6F7      	ANI	11110111B
  2369  7D48  77        	MOV	M,A
  2370  7D49  D3DA      	OUT	BTLCH;	Disable output GO.
  2371                  
  2372  7D4B  21E37F    	LXI	H,OUTST
  2373  7D4E  7E        	MOV	A,M
  2374  7D4F  0F        	RRC
  2375  7D50  77        	MOV	M,A;	Interchange RL with LR in preparation for the next line.
  2376  7D51  D2627D    	JNC	SET7;	Jump if current line was LR.
  2377                  
  2378  7D54  2A437F    	LHLD	LRYB
  2379  7D57  E5        	PUSH	H
  2380  7D58  2A417F    	LHLD	LRCOR
  2381  7D5B  EB        	XCHG
  2382  7D5C  2A457F    	LHLD	LRHSC
  2383  7D5F  C36D7D    	JMP	SET8
  2384                  
  2385  7D62  2A397F    SET7:	LHLD	RLYB
  2386  7D65  E5        	PUSH	H
  2387  7D66  2A377F    	LHLD	RLCOR
  2388  7D69  EB        	XCHG
  2389  7D6A  2A3B7F    	LHLD	RLHSC
  2390  7D6D  22357F    SET8:	SHLD	HCOG;	Move the next line's parameters into position.
  2391  7D70  2A4F7F    	LHLD	FMP
  2392  7D73  EB        	XCHG
  2393  7D74  22337F    	SHLD	CORR
  2394                  
  2395  7D77  E1        	POP	H
  2396  7D78  CD927D    	CALL	CMPD;	HL = new baseline, DE = current baseline.
  2397  7D7B  3E02      	MVI	A,2
  2398  7D7D  C4A879    	CNZ	NCLMP;	If next line has different baseline, unclamp the
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 17-8

  2399                  ;		   film and prepare to move to it while the lens motor slows down.
  2400                  
  2401  7D80  211C7F    	LXI	H,MSLS
  2402  7D83  7E        	MOV	A,M
  2403  7D84  E6F7      	ANI	11110111B
  2404  7D86  77        	MOV	M,A
  2405  7D87  D3DB      	OUT	MSLCH;	Turn off video.
  2406                  
  2407  7D89  210D7F    	LXI	H,READY
  2408  7D8C  35        	DCR	M;	READY←READY-1.
  2409                  
  2410  7D8D  97        	SUB	A
  2411  7D8E  321F7F    	STA	LIP;	LIP←0.
  2412  7D91  C9        	RET
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 18

  2413                  ; Handy general-purpose subroutines:
  2414                  
  2415                  ; Double compare, sets zero and carry flags like CMP does.
  2416                  ; DE plays the role of A and HL is the operand.
  2417                  ; (CALL CMPD takes 37 or 50 clock cycles.)
  2418  7D92  7A        CMPD:	MOV	A,D
  2419  7D93  BC        	CMP	H
  2420  7D94  C0        	RNZ
  2421  7D95  7B        	MOV	A,E
  2422  7D96  BD        	CMP	L
  2423  7D97  C9        	RET
  2424                  
  2425                  ; Double subtract, DE plays the role of A and HL is the operand. (Takes 55 cycles.)
  2426  7D98  7B        SUBD:	MOV	A,E
  2427  7D99  95        	SUB	L
  2428  7D9A  5F        	MOV	E,A
  2429  7D9B  7A        	MOV	A,D
  2430  7D9C  9C        	SBB	H
  2431  7D9D  57        	MOV	D,A
  2432  7D9E  C9        	RET
  2433                  
  2434                  ; Double negation, HL←-DE. (56 cycles.)
  2435  7D9F  EB        XNEGD:	XCHG	;	XNEGD sets DE←HL and HL←-HL.
  2436  7DA0  97        NEGD:	SUB	A
  2437  7DA1  93        	SUB	E
  2438  7DA2  6F        	MOV	L,A
  2439  7DA3  3E00      	MVI	A,0
  2440  7DA5  9A        	SBB	D
  2441  7DA6  67        	MOV	H,A
  2442  7DA7  C9        	RET
  2443                  
  2444                  ; Double multiply, HLDE ← HL times DE. (Takes 1126 cycles.)
  2445  7DA8  7D        MULTD:	MOV	A,L
  2446  7DA9  E5        	PUSH	H
  2447  7DAA  0E02      	MVI	C,2;	Stack=H0L0; C=2 and A=L0.
  2448  7DAC  0608      MULT1:	MVI	B,8
  2449  7DAE  210000    	LXI	H,0;	HL←0.
  2450  7DB1  29        MULT2:	DAD	H
  2451  7DB2  17        	RAL	;	AHL←2AHL.
  2452  7DB3  D2B97D    	JNC	MULT3
  2453  7DB6  19        	DAD	D;	If carry out of rA, AHL←AHL+DE.
  2454  7DB7  CE00      	ACI	0
  2455  7DB9  05        MULT3:	DCR	B
  2456  7DBA  C2B17D    	JNZ	MULT2;	Repeat eight times.
  2457  7DBD  0D        	DCR	C
  2458  7DBE  CACC7D    	JZ	MULT4
  2459  7DC1  C1        	POP	B;	Now AHL=DExL0=A1H1L1, and BC=H0L0.
  2460  7DC2  E5        	PUSH	H;	Stack=H1L1.
  2461  7DC3  6C        	MOV	L,H
  2462  7DC4  67        	MOV	H,A
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 18-2

  2463  7DC5  E5        	PUSH	H;	Stack=H1L1,A1H1.
  2464  7DC6  78        	MOV	A,B
  2465  7DC7  0E01      	MVI	C,1
  2466  7DC9  C3AC7D    	JMP	MULT1;	Stack holds A1H1L1; C=1 and A=H0.
  2467  7DCC  D1        MULT4:	POP	D;	Now AHL=D0E0xH0, and DE=A1H1.
  2468  7DCD  19        	DAD	D
  2469  7DCE  CE00      	ACI	0;	AHL←AHL+A1H1.
  2470  7DD0  D1        	POP	D;	Now AHLE = H0L0xD0E0, the desired product.
  2471  7DD1  55        	MOV	D,L
  2472  7DD2  6C        	MOV	L,H
  2473  7DD3  67        	MOV	H,A
  2474  7DD4  C9        	RET
  2475                  
  2476                  ; Move BC bytes from location HL to location DE.
  2477                  ; (Takes 39BC+15B+65 cycles, minus 20 if C=0.)
  2478  7DD5  111281    MOVBL:	LXI	D,BLANK;  Special case to move "blank" character info.
  2479  7DD8  010800    	LXI	B,8
  2480  7DDB  EB        	XCHG
  2481  7DDC  97        MOVE:	SUB	A;	Prepare to loop BC times.
  2482  7DDD  B1        	ORA	C
  2483  7DDE  CAE27D    	JZ	MOVE1
  2484  7DE1  04        	INR	B
  2485                  
  2486  7DE2  7E        MOVE1:	MOV	A,M;	Move one byte.
  2487  7DE3  12        	STAX	D
  2488  7DE4  23        	INX	H;	Advance pointers.
  2489  7DE5  13        	INX	D
  2490  7DE6  0D        	DCR	C
  2491  7DE7  C2E27D    	JNZ	MOVE1
  2492  7DEA  05        	DCR	B
  2493  7DEB  C2E27D    	JNZ	MOVE1
  2494  7DEE  C9        	RET
  2495                  
  2496  7DEF  214F01    DELAY2:	LXI	H,79+256;	Delays about 2 milliseconds.
  2497  7DF2  E3        DELAY:	XTHL	;	Delays 25.5(HL-256) microseconds, assuming that L≠0.
  2498  7DF3  E3        	XTHL	;	18+18+5+10 = 51 cycles = 25.5 microseconds.
  2499  7DF4  2D        	DCR	L
  2500  7DF5  C2F27D    	JNZ	DELAY
  2501  7DF8  25        	DCR	H
  2502  7DF9  C2F27D    	JNZ	DELAY
  2503  7DFC  C9        	RET
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 19

  2504                  ; Constants and special tables.
  2505                  
  2506  7DFD  00        BLNK:	DB	0;	Boundary data for a blank:
  2507  7DFE  00        	DB	0;		u7u6u5u4u3u2u1u0
  2508  7DFF  F8        	DB	11111000B;	d2d1d0z z uAu9u8
  2509  7E00  FF        	DB	11111111B;	v7v6v5v4v3v2v1v0
  2510  7E01  07        	DB	00000111B;	0 0 0 0 s vAv9v8
  2511  7E02  FF        	DB	11111111B;	a7a6a5a4a3a2a1a0
  2512  7E03  07        	DB	00000111B;	0 xAx9x80 aAa9a8
  2513  7E04  FF        	DB	11111111B;	b7b6b5b4b3b2b1b0
  2514  7E05  07        	DB	00000111B;	0 yAy9y80 bAb9b8
  2515  7E06  FF        	DB	11111111B;	x7x6x5x4x3x2x1x0
  2516  7E07  00        	DB	0;		(not used)
  2517  7E08  00        	DB	0;		y7y6y5y4y3y2y1y0
  2518  7E09  00        	DB	0;		(not used)
  2519  7E0A  C0        	DB	11000000B;	null boundary
  2520  7E0B  00        	DB	0;		end of boundary data
  2521  7E0C  0000F8    	DB	0,0,0F8H;	standard ending
  2522                  
  2523  7E0F  000E      TABLE:	DW	3584;	Acceleration and deceleration table for motors.
  2524  7E11  000E      	DW	3584
  2525  7E13  AB0B      	DW	2987
  2526  7E15  3E0A      	DW	2622
  2527  7E17  4109      	DW	2369
  2528  7E19  8208      	DW	2178
  2529  7E1B  ED07      	DW	2029
  2530  7E1D  7207      	DW	1906
  2531  7E1F  0C07      	DW	1804
  2532  7E21  B506      	DW	1717
  2533  7E23  6A06      	DW	1642
  2534  7E25  2806      	DW	1576
  2535  7E27  ED05      	DW	1517
  2536  7E29  B905      	DW	1465
  2537  7E2B  8905      	DW	1417
  2538  7E2D  5E05      	DW	1374
  2539  7E2F  3705      	DW	1335
  2540  7E31  1305      	DW	1299
  2541  7E33  F204      	DW	1266
  2542  7E35  D304      	DW	1235
  2543  7E37  B604      	DW	1206
  2544  7E39  9B04      	DW	1179
  2545  7E3B  8204      	DW	1154
  2546  7E3D  6B04      	DW	1131
  2547  7E3F  5504      	DW	1109
  2548  7E41  4004      	DW	1088
  2549  7E43  2C04      	DW	1068
  2550  7E45  1A04      	DW	1050
  2551  7E47  0804      	DW	1032
  2552  7E49  F703      	DW	1015
  2553  7E4B  E703      	DW	999
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 19-2

  2554  7E4D  D803      	DW	984
  2555  7E4F  C803      	DW	968
  2556  7E51  BB03      	DW	955
  2557  7E53  AE03      	DW	942
  2558  7E55  A103      	DW	929
  2559  7E57  9503      	DW	917
  2560  7E59  8903      	DW	905
  2561  7E5B  7D03      	DW	893
  2562  7E5D  7303      	DW	883
  2563  7E5F  6803      	DW	872
  2564  7E61  5E03      	DW	862
  2565  7E63  5403      	DW	852
  2566  7E65  4A03      	DW	842
  2567  7E67  4103      	DW	833
  2568  7E69  3803      	DW	824
  2569  7E6B  3003      	DW	816
  2570  7E6D  2703      	DW	807
  2571  7E6F  1F03      	DW	799
  2572  7E71  1703      	DW	791
  2573  7E73  0F03      	DW	783
  2574  7E75  0803      	DW	776
  2575  7E77  0103      	DW	769
  2576  7E79  FA02      	DW	762
  2577  7E7B  F302      	DW	755
  2578  7E7D  EC02      	DW	748
  2579  7E7F  E602      	DW	742
  2580  7E81  E002      	DW	736
  2581  7E83  D902      	DW	729
  2582  7E85  D302      	DW	723
  2583  7E87  CE02      	DW	718
  2584  7E89  C802      	DW	712
  2585  7E8B  C202      	DW	706
  2586  7E8D  BD02      	DW	701
  2587  7E8F  B702      	DW	695
  2588  7E91  B202      	DW	690
  2589  7E93  AD02      	DW	685
  2590  7E95  A802      	DW	680
  2591  7E97  A302      	DW	675
  2592  7E99  9F02      	DW	671
  2593  7E9B  9A02      	DW	666
  2594  7E9D  9502      	DW	661
  2595  7E9F  9102      	DW	657
  2596  7EA1  8C02      	DW	652
  2597  7EA3  8802      	DW	648
  2598  7EA5  8402      	DW	644
  2599  7EA7  8002      	DW	640
  2600  7EA9  7C02      	DW	636
  2601  7EAB  7802      	DW	632
  2602  7EAD  7402      	DW	628
  2603  7EAF  7002      	DW	624
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 19-3

  2604  7EB1  6C02      	DW	620
  2605  7EB3  6902      	DW	617
  2606  7EB5  6502      	DW	613
  2607  7EB7  6202      	DW	610
  2608                  
        7EB9  09204142  
        7EBD  4F525445  
  2609  7EC1  442E      ABORT:	DB	9,' ABORTED.';	message displayed when aborting.
  2610                  
  2611  7EC3            INITB:	;	The following are initial values of AlphaTEX variables (cf. INITV).
  2612  7EC3  00        	DB	0;	Sum of bytes not yet acknowledged (mod 256).
  2613  7EC4  00        	DB	0;	Keyboard input buffer when on-line.
  2614  7EC5  00        	DB	0;	Number of lines ready in LB for typesetting.
  2615  7EC6  0080      	DW	DQ;	Place to write next byte in DQ.
  2616  7EC8  0080      	DW	DQ;	Place of first unacknowledged byte in DQ.
  2617  7ECA  0080      	DW	DQ;	Place to read next byte in DQ.
  2618  7ECC  00        	DB	0;	Overrun flag (if bit 4 set).
  2619  7ECD  00        	DB	0;	QFLAG, acknowledge bits, 00001111 => send ABORT.
  2620  7ECE  00        	DB	0;	MFLAG, previous byte, calls protocol if = MAGIC.
  2621  7ECF  5505      	DW	1365;	Current horizontal multiplier (initially 2/3).
  2622  7ED1  FF        	DB	2047 AND 0FFH;	Current vertical multiplier (initially 1), lsb.
  2623  7ED2  95        	DB	(261-368) AND 0FFH; Current vertical shift, lsb.
  2624  7ED3  77        	DB	01110111B;	Most significant bits of vertical multiplier, shift.
  2625  7ED4  10        MSLSI:	DB	00010000B;	`Machine status latch' save.
  2626  7ED5  F6        BTLSI:	DB	11110110B;	`Boot latch' save.
  2627  7ED6  00        	DB	0;	If nonzero, must wait before starting new line.
  2628  7ED7  00        	DB	0;	If nonzero, means line in progress.
  2629  7ED8  18BC      	DW	LB;	Normal beginning of line buffer.
  2630  7EDA            INITE:	;	End of initialization table.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 20

  2631                  ; Program variables:
  2632                  
  2633                  ; The ORG instruction governing location ABRT on page 7 must be adjusted so
  2634                  ; that there is no memory conflict here (and so that space isn't wasted).
  2635  7F0B            	ORG	7FC2H-49*2-85
  2636  7F0B            INITV:	;	Variables that must be initialized when restarting AlphaTEX:
  2637  7F0B  00        SUMCH:	DB	0;	Sum of bytes not yet acknowledged (mod 256).
  2638  7F0C  00        KBIB1:	DB	0;	Keyboard input buffer when on-line.
  2639  7F0D  00        READY:	DB	0;	Number of lines ready in LB for typesetting.
  2640  7F0E  0080      DQIN:	DW	DQ;	Place to write next byte in DQ.
  2641  7F10  0080      DQACK:	DW	DQ;	Place of first unacknowledged byte in DQ.
  2642  7F12  0080      DQOUT:	DW	DQ;	Place to read next byte in DQ.
  2643  7F14  00        OVFLG:	DB	0;	Overrun flag (if bit 4 set).
  2644  7F15  00        QFLAG:	DB	0;	Acknowledge message bits...00001111 => ABORT.
  2645  7F16  00        MFLAG:	DB	0;	Contains last byte.  Flags protocol if = MAGIC.
  2646  7F17  5505      AMULT:	DW	1365;	Current horizontal multiplier (initially 2/3).
  2647  7F19  FF        BMULT:	DB	2047 AND 0FFH;	Current vertical multiplier (initially 1), lsb.
  2648  7F1A  95        YSHFT:	DB	(261-368) AND 0FFH; Current vertical shift, lsb.
  2649  7F1B  77        YSBM:	DB	01110111B;	Most significant bits of vertical shift & multiplier.
  2650  7F1C  10        MSLS:	DB	00010000B;	`Machine status latch' save.
  2651  7F1D  F6        BTLS:	DB	11110110B;	`Boot latch' save.
  2652  7F1E  00        FFLAG:	DB	0;	If nonzero, must wait before starting new line.
  2653  7F1F  00        LIP:	DB	0;	If nonzero, means line in progress.
  2654  7F20  18BC      LB0:	DW	LB;	Beginning of line buffer. (Can be changed for special jobs.)
  2655                  
  2656                  ; Variables that don't need to be initialized:
  2657  7F22  00        SFLAG:	DB	0;	Inside SETUP subroutine, indicates whether DMA is needed.
  2658  7F23  0000      LNGTH:	DW	0;	Length of first DMA on next scan done interrupt.
  2659  7F25  0000      YBASE:	DW	0;	Current baseline.
  2660  7F27  0000      LBIN:	DW	0;	Current line buffer position for storing data.
  2661  7F29  0000      LBOUT:	DW	0;	Current line buffer position for reading data.
  2662  7F2B  0000      RLI:	DW	0;	Accumulated starting cogs in RL state.
  2663  7F2D  0000      RLJ:	DW	0;	Accumulated ending cogs in RL state.
  2664  7F2F  0081      CHARI:	DW	CHAR1;	CHAR1 or CHAR2, entering character.
  2665  7F31  0081      CHARJ:	DW	CHAR1;	CHAR1 or CHAR2, exiting character.
  2666                  
  2667  7F33  0000      CORR:	DW	0;	Clock cycles of extra lens motion for next line.
  2668  7F35  0000      HCOG:	DW	0;	Hardware starting cog for next line.
  2669                  
  2670  7F37  0000      RLCOR:	DW	0;	Clock cycles of extra lens motion before RL line.
  2671  7F39  0000      RLYB:	DW	0;	Feed motor position of baseline for RL line.
  2672  7F3B  0000      RLHSC:	DW	0;	Hardware starting cog before RL line.
  2673  7F3D  0000      RLRST:	DW	0;	Lens motor rest position before RL line.
  2674  7F3F  0000      RLSTP:	DW	0;	Starting position in LB for RL line, less 5.
  2675                  
  2676  7F41  0000      LRCOR:	DW	0;	Clock cycles of extra lens motion before LR line.
  2677  7F43  0000      LRYB:	DW	0;	Feed motor position of baseline for LR line.
  2678  7F45  0000      LRHSC:	DW	0;	Hardware starting cog before LR line.
  2679  7F47  0000      LRRST:	DW	0;	Lens motor rest position before LR line.
  2680  7F49  0000      LRSTP:	DW	0;	Stopping position in LB for LR line.
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 20-2

  2681                  
  2682  7F4B  C076      YHOME:	DW	30400;	Initial feed motor position, in 5/8 mil units from top.
  2683  7F4D  0000      YWANT:	DW	0;	Desired feed motor position, in 5/8 mil units from top.
  2684  7F4F  C076      FMP:	DW	30400;	Current feed motor position, in 5/8 mil units from top.
  2685  7F51  0000      LMP:	DW	0;	Current lens motor position, in motor steps from left.
  2686                  
  2687  7F53  00        LTYPE:	DB	0;	Type of lens interrupt.
  2688  7F54  00        FTYPE:	DB	0;	Type of feed interrupt.
  2689  7F55  00        GTYPE:	DB	0;	Type of timer interrupt.
  2690                  
  2691  7F56  00        LLIM:	DB	0;	Least significant byte of top speed lens motor rate entry.
  2692  7F57  00        LSTAT:	DB	0;	Lens motor state.
  2693  7F58  0000      LRATE:	DW	0;	Pointer to current rate table entry for lens motor.
  2694  7F5A  0000      LSTEP:	DW	0;	Number of lens motor steps to be taken at top speed (≥2).
  2695                  
  2696  7F5C  00        FLIM:	DB	0;	Least significant byte of top speed feed motor rate entry.
  2697  7F5D  00        FSTAT:	DB	0;	Feed motor state.
  2698  7F5E  0000      FRATE:	DW	0;	Pointer to current rate table entry for feed motor.
  2699  7F60  0000      FSTP1:	DW	0;	Feed steps at top speed before FFLAG cleared (≥2).
  2700  7F62  00        FSTP2:	DB	0;	Feed steps at top speed after FFLAG cleared (0 or 26).
  2701                  
  2702  0062            STACK:	DS	49*2;
  2703                  ; Calculation of maximum stack requirement:
  2704                  ; If all six kinds of interrupt are being serviced simultaneously, they fill
  2705                  ; 7 (LMIS) + 3 (SDIS) + 7 (FMIS) + 3 (GPTIS) + 3 (KBIS) + 4 (RDIS) = 27 positions
  2706                  ; on the stack. Actually they can't all be active simultaneously (e.g., scan-done
  2707                  ; will never happen at the same time as feed-motor), but to be safe let's assume
  2708                  ; 27. On top of this --- actually underneath, as it turns out --- is stack space
  2709                  ; for a low-priority routine that finishes some interrupt handling, up to 9
  2710                  ; positions more (namely a return address, four register pairs, and four more
  2711                  ; to take care of CALL SETUP). Add 6 since a low-priority lens routine can
  2712                  ; coexist over a low-priority scan-done routine.  And underneath all this
  2713                  ; we have up to 7 more positions required (the worst case being PUSH, CALL LREST,
  2714                  ; which does two PUSHes and CALLs MULTD, which does two more PUSHes).
  2715                  ; Total 27+9+6+7=49 is more than sufficient stack space.
  2716                  
  2717                  ; The following data addresses are required by the boot PROM code.
  2718                  ; (A few locations that are available during on-line mode are also double-used.)
  2719  7FC2            	ORG	7FC2H
  2720  7FC2            ISPV:		;	initial stack pointer value
  2721  7FC2  00        LMBSY:	DB	0;	lens motor busy
  2722  7FC3  00        FMBSY:	DB	0;	feed motor busy
  2723  7FC4  00        KBLC:	DB	0;	keyboard load counter
  2724  7FC5  00        BTS3:	DB	0;	bootstrap temp storage
  2725  7FC6            TEMP:
        7FC6  00000000  
  2726  7FCA  00        BTS4:	DB	0,0,0,0,0;	(used by NFE routine)
  2727  7FCB  000000    KBIB:	DB	0,0,0;	keyboard input buffer (5 bytes, used by KBIS routine)
  2728  7FCE  0000      YB:	DW	0;	Feed motor position of baseline for first line on page.
  2729                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 20-3

  2730                  ; Further variables that don't need to be initialized.
  2731                  
  2732  7FD0  0000      COG:	DW	0;	Current software cog counter (increases by one on each
  2733                  		;		scan done, even when setting right to left).
  2734  7FD2  0000      COGI:	DW	0;	Software cog where next character is to enter.
  2735  7FD4  0000      COGJ:	DW	0;	Software cog where next character is to exit.
  2736  7FD6  0000      COGID:	DW	0;	Next increment for COGI.
  2737  7FD8  0000      COGJD:	DW	0;	Next increment for COGJ.
  2738  7FDA  0000      INSTB:	DW	0;	Line buffer pointer for beginning of line.
  2739  7FDC  0000      INSTE:	DW	0;	Line buffer pointer for end of line.
  2740  7FDE  0000      INSTI:	DW	0;	Line buffer pointer for entering character.
  2741  7FE0  0000      INSTJ:	DW	0;	Line buffer pointer for exiting character.
  2742  7FE2  00        STATE:	DB	0;	10101010 means LR, 01010101 means RL.
  2743  7FE3  00        OUTST:	DB	0;	10101010 if setting left to right, 01010101 if right to left.
  2744                  
  2745                  ; The following data addresses are required by the disk server.
  2746  7FE4            	ORG	7FE4H
  2747  000A            	DS	10;	disk server stack area
  2748  7FEE  00        VARSE:	DB	0;	variable sector format select
  2749  0009            	DS	9;	disk control and status area
  2750  7FF8  00        OKWD:	DB	0;	result byte, set to 8 when initiating action
  2751  7FF9  00        COMWD:	DB	0;	disk operation code
  2752  7FFA  00        DISK:	DB	0;	disk number
  2753  7FFB  00        TRACK:	DB	0;	track number
  2754  7FFC  00        SECTR:	DB	0;	sector number
  2755  7FFD  0000      ADDR:	DW	0;	RAM address
  2756  7FFF  00        NSCT:	DB	0;	number of sectors (0 means 256)
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 21

  2757                  ; The second memory board (locations 8000H and higher):
  2758                  
  2759  8000            	ORG	8000H
  2760  0100            DQ:	DS	256;	Cyclic buffer for RS232 data input.
  2761                  ; It is important that DQ and CHAR1 be locations of the form ..00H.
  2762                  
  2763  8100  09        CHAR1:	DB	CHAR2 AND 0FFH;  used to swap to other character.
  2764  8101  00        C1NB7:	DB	0;	character 1 new byte 7.
  2765  8102  0000      C1B7A:	DW	0;	character 1 address of byte 7.
  2766  8104  00        C1NBA:	DB	0;	character 1 new byte 10.
  2767  8105  0000      C1DC:	DW	0;	character 1 DMA count (boundary bytes + 1).
  2768  8107  0000      C1DI:	DW	0;	character 1 DMA info (address of byte 1).
  2769                  
  2770  8109  00        CHAR2:	DB	CHAR1 AND 0FFH;  used to swap to other character.
  2771  810A  00        C2NB7:	DB	0;	character 2 new byte 7.
  2772  810B  0000      C2B7A:	DW	0;	character 2 address of byte 7.
  2773  810D  00        C2NBA:	DB	0;	character 2 new byte 10.
  2774  810E  0000      C2DC:	DW	0;	character 2 DMA count (boundary bytes + 1).
  2775  8110  0000      C2DI:	DW	0;	character 2 DMA info (address of byte 1).
  2776                  
  2777  8112  07        BLANK:	DB	00000111B; "new byte 7" for a blank character.
  2778  8113  037E      	DW	BLNK+6;	address of byte 7.
  2779  8115  FF        	DB	11111111B; "new byte 10".
  2780  8116  1000      	DW	16;	boundary bytes + 1.
  2781  8118  FD7D      	DW	BLNK;	address of byte 1.
  2782                  
  2783  03F4            CTB:	DS	253*4;	Character table for known characters.
  2784                  	; 	CTB entries are length (2 bytes) followed by address (2 bytes).
  2785                  
  2786  850E            REP2:	;		Second repertoire area.
  2787                  
  2788  BC18            	ORG	0C000H-200*5;	(assuming a line buffer of size 200)
  2789  BC18            LB:	;		Double buffer for line output.
  2790                  ; The line buffer stores 5-word entries, either Adjust-cog instructions or
  2791                  ; modified Typeset instructions. Information for LR lines appears at the
  2792                  ; bottom of the buffer, RL lines at the top.
  2793  C000            LBEND	EQU	0C000H
  2794                  
  2795                  ; The following program loads "HEX" files assembled by the "MICROS" assembler.
  2796                  ; Since it won't assemble things into locations ≥ 0BE00H, any errors in
  2797                  ; the loader itself have to be patched by hand.
  2798                  
  2799  BF00            	ORG	0BF00H
  2800  BF00            LOADR:
  2801  BF00  CDAABF    NEWLN:	CALL	GETC;	Wait for a colon or dollar sign.
  2802  BF03  FE24      	CPI	'$'
  2803  BF05  CA2040    	JZ	START;	A dollar sign means we are done.
  2804  BF08  FE3A      	CPI	':'
  2805  BF0A  C200BF    	JNZ	NEWLN;	Skip everything before a colon.
  2806                  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 21-2

  2807  BF0D  0600      	MVI	B,0;	Clear the check sum.
  2808  BF0F  CD8EBF    	CALL	GETH;	Read the number of data bytes.
  2809  BF12  B7        	ORA	A
  2810  BF13  CA00BF    	JZ	NEWLN;	Ignore whole line, if there aren't any.
  2811  BF16  4F        	MOV	C,A;	Otherwise save the number of bytes in C.
  2812                  
  2813  BF17  CD8EBF    	CALL	GETH;	Read the address.
  2814  BF1A  FEBE      	CPI	0BEH
  2815  BF1C  D200BF    	JNC	NEWLN;	Don't load into locations 0BE00H and higher.
  2816  BF1F  67        	MOV	H,A
  2817  BF20  CD8EBF    	CALL	GETH
  2818  BF23  6F        	MOV	L,A;	HL ← current load address.
  2819                  
  2820  BF24  CD8EBF    	CALL	GETH;	Read the dummy byte.
  2821  BF27  B7        	ORA	A
  2822  BF28  C23ABF    	JNZ	BADCH;	It should be zero.
  2823                  
  2824  BF2B  CD8EBF    NXTBY:	CALL	GETH;	Read a data byte.
  2825  BF2E  77        	MOV	M,A;	Load it into proper place.
  2826  BF2F  23        	INX	H
  2827  BF30  0D        	DCR	C
  2828  BF31  C22BBF    	JNZ	NXTBY;	Repeat until rC=0.
  2829                  
  2830  BF34  CD8EBF    CHECK:	CALL	GETH;	Read the sum check byte.
  2831  BF37  CA00BF    	JZ	NEWLN;	Jump if it's zero (i.e., satisfactory).
  2832                  
  2833  BF3A  1155BF    BADCH:	LXI	D,DM13;	Display ' SUM CHECK FAILED!'
  2834  BF3D  CD1502    	CALL	DCS
  2835  BF40  0E1E      	MVI	C,30;	Delay about 30 seconds, ignoring the rest of the file.
  2836  BF42  21204E    BADC1:	LXI	H,20000
  2837  BF45  CDF27D    	CALL	DELAY
  2838  BF48  0D        	DCR	C
  2839  BF49  C242BF    	JNZ	BADC1
  2840                  
  2841  BF4C  1168BF    	LXI	D,DM12;	Display 'TRY TO SEND THE WHOLE HEX FILE AGAIN:'
  2842  BF4F  CD1502    	CALL	DCS
  2843  BF52  C300BF    	JMP	LOADR
  2844                  
        BF55  12205355  
        BF59  4D204348  
        BF5D  45434B20  
        BF61  4641494C  
  2845  BF65  454421    DM13:	DB	18,' SUM CHECK FAILED!'
        BF68  25545259  
        BF6C  20544F20  
        BF70  53454E44  
        BF74  20544845  
        BF78  2057484F  
        BF7C  4C452048  
        BF80  45582046  
MICRO-SYMBOL 7-JULY-1980   ALPHA   PAGE 21-3

        BF84  494C4520  
        BF88  41474149  
  2846  BF8C  4E3A      DM12:	DB	37,'TRY TO SEND THE WHOLE HEX FILE AGAIN:'
  2847                  
  2848                  ; The following subroutine reads a byte of hex, updates the check sum,
  2849                  ; and returns with condition zero if the check sum is zero.
  2850  BF8E  CD9FBF    GETH:	CALL	GETD
  2851  BF91  87        	ADD	A;	Left shift four.
  2852  BF92  87        	ADD	A
  2853  BF93  87        	ADD	A
  2854  BF94  87        	ADD	A
  2855  BF95  5F        	MOV	E,A
  2856  BF96  CD9FBF    	CALL	GETD
  2857  BF99  83        	ADD	E
  2858  BF9A  5F        	MOV	E,A
  2859  BF9B  80        	ADD	B
  2860  BF9C  47        	MOV	B,A;	Accumulate check sum.
  2861  BF9D  7B        	MOV	A,E
  2862  BF9E  C9        	RET
  2863                  
  2864  BF9F  CDAABF    GETD:	CALL	GETC;	Subroutine to read a hex digit:
  2865  BFA2  D630      	SUI	'0'
  2866  BFA4  FE0A      	CPI	10
  2867  BFA6  D8        	RC	;	Return, it was a digit.
  2868  BFA7  D607      	SUI	'A'-'0'-10
  2869  BFA9  C9        	RET	;	Assume that it was between A and F.
  2870                  
  2871  BFAA  DB81      GETC:	IN	RS232+1;	Subroutine to read an ASCII character:
  2872  BFAC  1F        	RAR
  2873  BFAD  1F        	RAR
  2874  BFAE  D2AABF    	JNC	GETC;		Wait until character has been received.
  2875                  
  2876  BFB1  DB80      	IN	RS232
  2877  BFB3  F5        	PUSH	PSW
  2878  BFB4  E5        	PUSH	H
  2879  BFB5  D5        	PUSH	D
  2880  BFB6  CD2302    	CALL	DC;		Echo it on the CRS display.
  2881  BFB9  D1        	POP	D
  2882  BFBA  E1        	POP	H
  2883  BFBB  F1        	POP	PSW
  2884  BFBC  C9        	RET
  2885                  
  2886  BFBD  00        XSUM:	DB	0
  2887                  
                  	END

No errors detected.

Program break is BFBE
MICRO-SYMBOL 7-JULY-1980   SYMBOL TABLE   PAGE 1

ABORT   7EB9     CHARJ   7F31     DSKARG  43F0     GETC    BFAA
ABRT    73A0     CHB     412D     DSKCOM  40E7     GETD    BF9F
ABRT1   73A2     CHB1    785E     DSKGO   40F5     GETH    BF8E
ADDR    7FFD     CHBOL   783D     DSKWT   40FA     GPTI1   79DE
ADJC    765A     CHECK   BF34     DUMP    40C9     GPTI2   79E4
AMULT   7F17     CHK32K  43E8     DUMP3   40C0     GPTI3   79ED
AQUIT   770F     CMPD    7D92     DUMP4   40C3     GPTIS   79C4
BAD     76A8     CMULT   7624     EIS     01B9     GTIMR   00CA
BADC1   BF42     COG     7FD0     EOF     73C9     GTYPE   7F55
BADCH   BF3A     COGI    7FD2     EOL     7A7D     HCOG    7F35
BEAMR   0098     COGID   7FD6     EOL1    7AB2     INIT1   40A5
BLANK   8112     COGJ    7FD4     EOL2    7AD1     INIT3   40C0
BLNK    7DFD     COGJD   7FD8     ERROR   010D     INITB   7EC3
BMULT   7F19     COLL    00DE     FCY1A   7954     INITD   4096
BOL     7B2A     COMWD   7FF9     FCY2A   7931     INITE   7EDA
BOL1    7B4F     CORR    7F33     FCY2B   7939     INITV   7F0B
BOL2    7B5C     CTB     811A     FCYC    78F0     INSTB   7FDA
BP1     7A0E     DC      0223     FCYC1   793D     INSTE   7FDC
BP2     7A1C     DCS     0215     FCYC2   7927     INSTI   7FDE
BP3     7A3A     DEB0    4426     FCYC3   7905     INSTJ   7FE0
BPAGE   7A06     DEB1    445D     FCYC4   7920     INT     00C0
BRIT1   7597     DEB2    444E     FCYC6   7964     INTCL   6024
BRIT2   75C7     DEB3    4432     FCYC7   7974     INTSP   6022
BRIT3   75E2     DEBUG   4430     FCYC8   797C     INTSV   6020
BRIT4   75F8     DELAY   7DF2     FCYC9   7998     INTTP   6021
BRITE   758F     DELAY2  7DEF     FCYCS   790B     ISPV    7FC2
BRT1    0088     DISK    7FFA     FEED    7612     ISW     7763
BRT2    00A0     DISP1   74DA     FFLAG   7F1E     ISW0    7766
BSTEP   00DF     DISPL   00DD     FGO     787D     KBIB    7FCB
BTAD    024F     DISPM   74D9     FGO1    7894     KBIB1   7F0C
BTLCH   00DA     DM1     42E9     FGO2    7897     KBIS    0173
BTLS    7F1D     DM10    43AE     FGO3    78BB     KBIS1   7734
BTLSI   7ED5     DM11    43C8     FGO3A   78CE     KBIS2   774D
BTS3    7FC5     DM12    BF68     FGO4    7878     KBLC    7FC4
BTS4    7FC6     DM13    BF55     FL1     4279     LB      BC18
C1B7A   8102     DM14    43CE     FL2     428A     LB0     7F20
C1DC    8105     DM2     4303     FL3     4290     LBEND   C000
C1DI    8107     DM3     4329     FLASH   4272     LBIN    7F27
C1NB7   8101     DM4     4339     FLIM    7F5C     LBOUT   7F29
C1NBA   8104     DM5     4350     FMBSY   7FC3     LCYC    77C4
C2B7A   810B     DM6     436C     FMIS    786E     LCYC1   781E
C2DC    810E     DM7     438A     FMP     7F4F     LCYC2   77FB
C2DI    8110     DM8     4393     FRATE   7F5E     LCYC3   77D9
C2NB7   810A     DM9     4399     FSTAT   7F5D     LCYC4   77F4
C2NBA   810D     DMA     00D2     FSTP1   7F60     LCYC5   7818
CAC     014C     DNWRD   4268     FSTP2   7F62     LCYC7   7831
CDTAC   0152     DQ      8000     FTIMR   00D0     LCYCS   77DF
CHAR1   8100     DQACK   7F10     FTYPE   7F54     LGO     776B
CHAR2   8109     DQIN    7F0E     GET     7400     LGO0    7769
CHARI   7F2F     DQOUT   7F12     GET0    742D     LGO1    7786
MICRO-SYMBOL 7-JULY-1980   SYMBOL TABLE   PAGE 2

LGO2    7788     ONLIN   42A9     SDIS2   7BD2     TABLE   7E0F
LGO3    779F     ONWRD   4264     SECTR   7FFC     TEMP    7FC6
LIP     7F1F     OUTST   7FE3     SENDB   44AE     TRAC1   440B
LLIM    7F56     OVFLG   7F14     SENDC   44C6     TRAC2   43F6
LMBSY   7FC2     OVRUN   76A6     SERCH   4155     TRAC3   4423
LMIS    7751     POP1L   7BE2     SET1    7BED     TRACE   43F4
LMP     7F51     POP2    775A     SET1A   7C03     TRACK   7FFB
LNGTH   7F23     POP2L   7BE1     SET1B   7C06     TRACL   43F0
LOAD    4104     POP3    7759     SET1C   7C2D     TYP1    743B
LOADR   BF00     POP3L   7BE0     SET1D   7C33     TYP2    7496
LR1     7B15     POP4    7758     SET1E   7C48     TYP3    747F
LRATE   7F58     POP4L   7BDF     SET1F   7C49     TYP4    74B7
LRCOR   7F41     PRMPT   402C     SET2    7C50     TYPST   743A
LREST   7ADF     PRTCL   76B1     SET3    7C68     UNTR    4463
LRHSC   7F45     QFLAG   7F15     SET3A   7CC5     UNTR1   4474
LRRST   7F47     QOK     7424     SET3B   7CCF     UNTR2   449D
LRSTP   7F49     QUIT    406B     SET3C   7CF6     UNTR3   4495
LRYB    7F43     RATE    00B8     SET3D   7CFC     UNTR4   44A5
LSTAT   7F57     RDATA   768D     SET3E   7D11     UNTR5   44A8
LSTEP   7F5A     RDIS    7679     SET3F   7D12     UNTRL   43F2
LTIMR   00C8     RDIS4   76D9     SET4    7D19     VARSE   7FEE
LTYPE   7F53     RDIS6   7704     SET6    7D39     WAIT    4032
MAGIC   0069     RDKC    4134     SET7    7D62     WAIT1   4037
MFLAG   7F16     RDKC1   4138     SET8    7D6D     WRT32K  43E0
MM1     4208     RDKC2   413C     SETADR  0005     XNEGD   7D9F
MM2     4230     READ    74BA     SETCOM  0001     XSUM    BFBD
MM3     426C     READ1   754D     SETDSK  0002     YB      7FCE
MODFY   41EF     READ2   74E7     SETNSC  0007     YBASE   7F25
MOVBL   7DD5     READ3   758B     SETSCT  0004     YHOME   7F4B
MOVE    7DDC     READY   7F0D     SETTRK  0003     YSBM    7F1B
MOVE1   7DE2     REP1    4020     SETUP   7BE4     YSHFT   7F1A
MSLCH   00DB     REP2    850E     SETVAR  0000     YWANT   7F4D
MSLS    7F1C     RESET   73A9     SFLAG   7F22     ZORO    76C5
MSLSI   7ED4     REST0   4460     SHUF1   7575
MULT1   7DAC     REST1   73AB     SHUFF   755B
MULT2   7DB1     REST2   73B5     SLOC    41ED
MULT3   7DB9     RLCOR   7F37     SLOOK   41EB
MULT4   7DCC     RLHSC   7F3B     SMD     01FE
MULTD   7DA8     RLI     7F2B     SRCH1   417B
NCL1    79BD     RLJ     7F2D     SRCH2   417C
NCLMP   79A8     RLRST   7F3D     SRCH3   4194
NEGD    7DA0     RLSTP   7F3F     SRCH4   41C7
NEW1    7513     RLYB    7F39     SRCH9   41E4
NEWCH   74EA     RPLCH   00DF     STACK   7F63
NEWDSK  43D8     RPORT   7717     START   4020
NEWLN   BF00     RPRT0   7725     STATE   7FE2
NFE     0110     RPRT1   772F     SUBD    7D98
NSCT    7FFF     RS232   0080     SUMCH   7F0B
NXTBY   BF2B     SDIS    7B8A     SWICH   403B
OKWD    7FF8     SDIS1   7BC7     SWT     404B

ABORT	   697	  2609#
ABRT	   696#	   764
ABRT1	   595	   697#
ADDR	  2755#
ADJC	   905	  1178#	  1180
AMULT	   973	   976	  1149	  2646#
AQUIT	  1246	  1302#
BAD	  1234#	  1250
BADC1	  2836#	  2839
BADCH	  2822	  2833#
BEAMR	    38#	  1075
BLANK	  2478	  2777#
BLNK	  2506#	  2778	  2781
BMULT	   980	  1157	  2647#
BOL	  1530	  1542	  1985#
BOL1	  1995	  2007#
BOL2	  2005	  2015#
BP1	  1818#	  1823
BP2	  1825#	  1835
BP3	  1828	  1831	  1842#
BPAGE	   901	  1813#
BRIT1	  1050#	  1055
BRIT2	  1083#	  1087	  1104
BRIT3	  1096	  1103#
BRIT4	  1114	  1116#	  1118	  1120
BRITE	  1045#
BRT1	    36#	  1090	  1127	  1130
BRT2	    37#	  1091
BSTEP	    39#	  1083	  1116
BTAD	    47#
BTLCH	    34#	   130	   468	   580	  1080	  1391	  1583	  1789	  2370
BTLS	   128	   577	   579	  1076	  1381	  1573	  1785	  2366	  2651#
BTLSI	   467	  2626#
BTS3	  2724#
BTS4	  2726#
C1B7A	  2343	  2765#
C1DC	  2351	  2767#
C1DI	  2069	  2768#
C1NB7	  2342	  2764#
C1NBA	  2348	  2766#
C2B7A	  2077	  2772#
C2DC	  2085	  2774#
C2DI	  2091	  2775#
C2NB7	  2076	  2771#
C2NBA	  2082	  2773#
CAC	    48#	   297	   299	   306	   308	   366	   368
CDTAC	    49#	   246	   655	   658
CHAR1	  2038	  2664	  2665	  2763#	  2770
CHAR2	  2283	  2763	  2770#
CHARI	  2024	  2249	  2251	  2664#
CHARJ	  2025	  2136	  2138	  2665#
CHB	   224#	   263	   267	   344	   347	   393
CHB1	  1532	  1536#
CHBOL	  1510#	  1701	  1930
CHECK	  2830#
CHK32K	   178	   493#
CMPD	   725	  1375	  1403	  1571	  1587	  1601	  1610	  1678	  2129	  2146
	  2198	  2208	  2218	  2291	  2396	  2418#
CMULT	   894	  1144#
COG	  2125	  2194	  2732#
COGI	  2033	  2207	  2285	  2305	  2311	  2333	  2734#
COGID	  1917	  2324	  2328	  2736#
COGJ	  2035	  2128	  2160	  2166	  2188	  2735#
COGJD	  1921	  2179	  2183	  2737#
COLL	    41#	  2099
COMWD	   191	  2751#
CORR	  1480	  1482	  1860	  2393	  2667#
CTB	   803	   921	  1004	  2229	  2783#
DC	    50#	   247	   741	   909	  2880
DCS	    51#	    90	   310	   370	   698	  2834	  2842
DEB0	   577#
DEB1	   587	   589	   603#
DEB2	   597#	   603
DEB3	   567	   585#
DEBUG	   582#
DELAY	   440	   666	   702	  2497#	  2500	  2502	  2837
DELAY2	  1424	  1806	  2496#
DISK	  2752#
DISP1	   908#	   911
DISPL	    33#	   432	  1326
DISPM	   907#
DM1	   477#	   608
DM10	   206	   486#
DM11	   292	   309	   487#
DM12	  2841	  2846#
DM13	  2833	  2845#
DM14	   470	   488#
DM2	    89	   478#
DM3	   147	   479#
DM4	   167	   480#
DM5	   171	   481#
DM6	   182	   482#
DM7	   257	   338	   483#
DM8	   360	   369	   484#
DM9	   405	   485#
DMA	    40#	  2066	  2068	  2071	  2073	  2074	  2087	  2089	  2093	  2095
	  2097
DNWRD	   386	   402#
DQ	  2615	  2616	  2617	  2640	  2641	  2642	  2760#
DQACK	   781	  1293	  1298	  2641#
DQIN	   766	  1216	  1230	  1288	  2640#
DQOUT	   749	   787	  1226	  2642#
DSKARG	   495#	   503
DSKCOM	   151	   175	   179	   187#
DSKGO	   158	   194#
DSKWT	   197#	   199
DUMP	   120	   171#
DUMP3	   167#	   176
DUMP4	   168#	   183	   406
EIS	    52#
EOF	   715#	   720	  1041
EOL	   914	  1877#
EOL1	  1896	  1909#
EOL2	  1907	  1925#
ERROR	    53#	    64	    78	   673	   675	   677	   679	   681	   685	   687
FCY1A	  1696	  1703#
FCY2A	  1679	  1682#
FCY2B	  1685#	  1710
FCYC	  1553	  1632	  1640#
FCYC1	  1642	  1688#
FCYC2	  1650	  1677#
FCYC3	  1653#	  1721
FCYC4	  1666	  1671#
FCYC6	  1689	  1705	  1712#
FCYC7	  1715	  1723#
FCYC8	  1728#
FCYC9	  1734	  1744#
FCYCS	  1657#	  1686
FEED	   998	  1134#
FFLAG	  1516	  1699	  1736	  1759	  1808	  2652#
FGO	  1567#	  1809
FGO1	  1576	  1580#
FGO2	  1579	  1582#
FGO3	  1602	  1605#
FGO3A	  1611	  1617#
FGO4	  1564#	  1589
FL1	   413#	   443
FL2	   416	   424#
FL3	   420	   422	   426	   429#
FLASH	   124	   408#
FLIM	  1629	  1645	  2696#
FMBSY	   716	  1053	  1631	  1635	  1664	  1730	  1758	  1792	  1819	  2722#
FMIS	    71	  1549#
FMP	   722	  1570	  1591	  2391	  2684#
FRATE	  1625	  1644	  1653	  1713	  2698#
FSTAT	  1640	  1684	  1692	  2697#
FSTP1	  1619	  1682	  2699#
FSTP2	  1617	  1703	  2700#
FTIMR	    31#	  1658	  1660	  1662	  1669	  1672	  1674	  1724	  1726
FTYPE	  1567	  1694	  1728	  2688#
GET	   749#	   783	   822	   824	   827	   829	   889	   896	   903	   908
	   925	   927	   930	   932	   952	   995	  1008	  1010	  1045	  1047
	  1134	  1136	  1144	  1146	  1151	  1153	  1182	  1184	  1813	  1815
	  1848	  1850	  1877	  1879
GET0	   752	   757	   769	   781#
GETC	  2801	  2864	  2871#	  2874
GETD	  2850	  2856	  2864#
GETH	  2808	  2813	  2817	  2820	  2824	  2830	  2850#
GPTI1	  1780	  1792#
GPTI2	  1742	  1783	  1795#
GPTI3	  1795	  1799#
GPTIS	    73	  1775#
GTIMR	    30#	  1481	  1483	  1768	  1770
GTYPE	  1479	  1751	  1757	  1778	  2689#
HCOG	  1862	  1988	  2390	  2668#
INIT1	   154#	   163
INIT3	   152	   159	   166#
INITB	   604	   706	   708	  2611#
INITD	   118	   147#
INITE	   604	   706	  2630#
INITV	   707	  2636#
INSTB	  2016	  2215	  2738#
INSTE	  2021	  2143	  2288	  2739#
INSTI	  2017	  2217	  2290	  2303	  2740#
INSTJ	  2018	  2145	  2158	  2741#
INT	    32#	    83	    85	    87	   126	   210	   446	   448	   450	   452
	   539	   544	   560	   710	   713	  1355	  1357
INTCL	   137	   693#
INTSP	   144	   692#
INTSV	   127	   690#
INTTP	   691#
ISPV	   469	  2720#
ISW	  1359#	  1533	  1538	  1796	  1801	  2104	  2109
ISW0	  1359	  1364#	  1537	  1800	  2108
KBIB	    97	   242	   262	   266	   318	   343	   346	   380	   392	   396
	  2727#
KBIB1	   732	  1328	  1833	  2638#
KBIS	    54#	   684
KBIS1	    75	  1323#
KBIS2	  1330	  1334	  1340#
KBLC	    92	   233	   235	   313	   314	   374	   409	   434	   611	   620
	  2723#
LB	  2629	  2654	  2789#
LB0	  1872	  1923	  2012	  2654#
LBEND	  1906	  2003	  2793#
LBIN	   796	   851	   885	  1188	  1873	  1895	  1925	  2660#
LBOUT	  1874	  2661#
LCYC	  1348	  1425	  1433#
LCYC1	  1435	  1489#
LCYC2	  1444	  1470#
LCYC3	  1447#	  1499
LCYC4	  1460	  1464#
LCYC5	  1476	  1485#
LCYC7	  1493	  1501#
LCYCS	  1451#	  1472
LGO	  1372#	  2028
LGO0	   730	  1371#	  1870
LGO1	  1383	  1389#
LGO2	  1387	  1390#
LGO3	  1404	  1407#
LIP	  2411	  2653#
LLIM	  1422	  1437	  2691#
LMBSY	   718	  1051	  1428	  1458	  1507	  1515	  1821	  2721#
LMIS	    67	  1344#
LMP	  1106	  1374	  1379	  2685#
LNGTH	  2061	  2354	  2360	  2658#
LOAD	   123	   203#
LOADR	   203	   222	  2800#	  2843
LR1	  1957	  1972#
LRATE	  1419	  1438	  1447	  1491	  2693#
LRCOR	  1859	  1974	  2380	  2676#
LREST	  1846	  1890	  1935#
LRHSC	  1861	  1981	  2382	  2678#
LRRST	  1868	  1976	  1997	  2679#
LRSTP	  1898	  2010	  2680#
LRYB	  1911	  2378	  2677#
LSTAT	  1433	  1486	  1490	  2361	  2692#
LSTEP	  1410	  1470	  2694#
LTIMR	    29#	   132	   133	   135	   139	   141	  1452	  1454	  1456	  1462
	  1465	  1467	  1502	  1504
LTYPE	  1372	  1474	  2687#
MAGIC	  1201#	  1208	  1213	  1242
MFLAG	  1206	  2645#
MM1	   350#	   382	   400	   403
MM2	   374#	   376
MM3	   352	   354	   405#
MODFY	   121	   338#	   384
MOVBL	  2141	  2284	  2478#
MOVE	   192	   711	  1037	  2481#
MOVE1	  2483	  2486#	  2491	  2493
MSLCH	    35#	   466	   738	  1748	  1766	  1840	  2205	  2405
MSLS	   734	  1313	  1744	  1762	  1825	  2201	  2401	  2650#
MSLSI	   465	  2625#
MULT1	  2448#	  2466
MULT2	  2450#	  2456
MULT3	  2452	  2455#
MULT4	  2458	  2467#
MULTD	   819	  1059	  1160	  1948	  1952	  2445#
NCL1	  1752	  1768#
NCLMP	   727	  1757#	  1866	  2398
NEGD	  1881	  2436#
NEW1	   949	   952#	   956	   958
NEWCH	   916#
NEWDSK	   150	   491#
NEWLN	  2801#	  2805	  2810	  2815	  2831
NFE	    55#	   168
NSCT	   155	  2756#
NXTBY	  2824#	  2828
OKWD	   195	   197	  2750#
ONLIN	   115	   445#
ONWRD	   390	   399#
OUTST	  1844	  1993	  2173	  2318	  2372	  2743#
OVFLG	  1234	  1260	  2643#
OVRUN	  1228	  1233#
POP1L	  1513	  1520	  2118#
POP2	  1341	  1352#	  1790	  1793	  1797	  2105
POP2L	  2117#
POP3	  1214	  1231	  1238	  1271	  1294	  1300	  1304	  1320	  1351#
POP3L	  2116#
POP4	  1350#	  1554
POP4L	  1543	  1810	  2115#
PRMPT	    89#	   109	   110	   111	   112	   113	   114	   116	   117	   164
	   169	   180	   205	   332	   388	   398	   648
PRTCL	  1210	  1240#
QFLAG	   586	   750	   762	   773	   776	  1268	  1285	  1303	  1307	  1337
	  1829	  2644#
QOK	   773#
QUIT	   126#
RATE	    44#	   213	   455
RDATA	  1216#	  1243
RDIS	    77	  1203#
RDIS4	  1262	  1265#
RDIS6	  1289	  1296#
RDKC	   232#	   260	   341	   373
RDKC1	   235#	   250
RDKC2	   237#	   238
READ	   742	   889#	   912	   992	  1038	  1131	  1142	  1176	  1875	  1932
READ1	   891	   994#
READ2	   898	   914#
READ3	   997	  1040#
READY	   715	   792	  1023	  1050	  1178	  1511	  1818	  1927	  2407	  2639#
REP1	    80#
REP2	  2786#
RESET	   700#
REST0	   597	   599	   604#
REST1	   701#	   704
REST2	   474	   588	   590	   598	   600	   706#
RLCOR	  1962	  2387	  2670#
RLHSC	  1969	  2389	  2672#
RLI	   875	   877	  1903	  1914	  2662#
RLJ	   878	   880	  1904	  1918	  2663#
RLRST	  1964	  2007	  2673#
RLSTP	  1909	  2000	  2674#
RLYB	  1900	  2385	  2671#
RPLCH	    42#	  1986	  1991	  2015
RPORT	  1253	  1306#
RPRT0	  1309	  1313#
RPRT1	  1310	  1316	  1319#
RS232	    43#	   215	   217	   219	   221	   457	   459	   461	   463	   668
	   696	   754	   774	  1209	  1273	  1297	  1319	  2871	  2876
SDIS	    69	  2050#
SDIS1	  2064	  2099#
SDIS2	  2103	  2107#
SECTR	   157	  2754#
SENDB	   637	   639	   642	   650#
SENDC	   625	   627	   656	   659	   661	   664#
SERCH	   119	   254#
SET1	  2128#	  2190
SET1A	  2039	  2141#
SET1B	  2143#	  2167
SET1C	  2147	  2169#
SET1D	  2162	  2172#
SET1E	  2175	  2186#
SET1F	  2170	  2188#
SET2	  2130	  2192#
SET3	  2199	  2207#	  2336
SET3A	  2219	  2283#
SET3B	  2281	  2288#	  2312
SET3C	  2292	  2314#
SET3D	  2307	  2317#
SET3E	  2320	  2331#
SET3F	  2315	  2333#
SET4	  2209	  2338#
SET6	  2340	  2360#
SET7	  2376	  2385#
SET8	  2383	  2390#
SETADR	   501#
SETCOM	   497#
SETDSK	   498#
SETNSC	   502#
SETSCT	   500#
SETTRK	   499#
SETUP	  2113	  2122#
SETVAR	   496#
SFLAG	  2123	  2133	  2212	  2338	  2657#
SHUF1	  1023#	  1025
SHUFF	  1000#
SLOC	   288	   298	   300	   326	   334#
SLOOK	   290	   322	   325	   333#
SMD	    56#	   148	   172	   207	   258	   339	   471	   609
SRCH1	   272#	   275	   328
SRCH2	   273#	   278
SRCH3	   283	   288#
SRCH4	   315#	   316
SRCH9	   286	   320	   330#
STACK	  2702#
START	    81#	   145	   601	  2803
STATE	   832	   870	  1843	  1884	  1955	  2742#
SUBD	   841	   969	  1162	  1393	  1408	  1585	  1606	  1614	  1937	  1960
	  2426#
SUMCH	  1220	  1255	  2637#
SWICH	    97#	   436
SWT	   101	   109#
TABLE	  1418	  1489	  1624	  1712	  2523#
TEMP	  2223	  2246	  2725#
TRAC1	   551#	   556
TRAC2	   535#	   594
TRAC3	   568#
TRACE	   533#
TRACK	   161	  2753#
TRACL	   473	   506#	   548	   558	   592	   612
TYP1	   792#	   794
TYP2	   863#	  1197
TYP3	   834	   840#
TYP4	   872	   885#
TYPST	   791#	   994
UNTR	   122	   608#
UNTR1	   616#	   644
UNTR2	   618	   641#
UNTR3	   631	   636#
UNTR4	   634	   646#
UNTR5	   622	   647#
UNTRL	   507#	   614	   647
VARSE	   188	  2748#
WAIT	    91#
WAIT1	    94#	    95
WRT32K	   174	   492#
XNEGD	  1915	  1919	  2435#
XSUM	  2886#
YB	  1564	  1738	  1857	  2728#
YBASE	  1139	  1141	  1856	  1893	  2659#
YHOME	   724	  2682#
YSBM	   984	  2649#
YSHFT	   990	  1174	  2648#
YWANT	  1739	  1760	  1807	  2683#
ZORO	  1247	  1252#